Compare commits

...

157 Commits

Author SHA1 Message Date
Matthias Clasen 025e4721ba spin button: Drop keybinding signals 2019-06-24 22:44:31 +00:00
Matthias Clasen ab24a46310 label: Drop keybinding signals
They are no longer used.
2019-06-24 22:44:31 +00:00
Matthias Clasen c7b5e75377 label: Port bindings from signal to action 2019-06-24 22:44:31 +00:00
Matthias Clasen 130c8b1b7b label: Add a move-cursor action 2019-06-24 22:44:31 +00:00
Matthias Clasen 2a76337c82 label: Document actions 2019-06-24 22:44:31 +00:00
Matthias Clasen b38f0f67c8 label: Cosmetics
Move actions before keybindings in class init.
2019-06-24 22:44:31 +00:00
Matthias Clasen 9aebb66755 label: Stop using copy-clipboard signal
No need for a signal emission here, we can
just call the function.
2019-06-24 22:44:31 +00:00
Matthias Clasen da36d0502f window: Actually listen for focus change
Same as the previous commit: We need a bubble
phase key controller to receive focus change
events.
2019-06-24 22:44:31 +00:00
Matthias Clasen bf56f1a8c5 popovermenu: Actually listen to focus change
As it turns out, capture phase controllers
don't see any crossing events, so we need to
use separate controllers for key presses and
focus change.
2019-06-24 22:44:31 +00:00
Matthias Clasen 8cf231c3b7 window: No need to keep the key controller
We don't need access to it after creating it.
2019-06-24 22:44:31 +00:00
Matthias Clasen 2cd739ae23 popover: Actually install tab bindings 2019-06-24 22:44:31 +00:00
Matthias Clasen 5b39a06032 Drop the move-focus signal 2019-06-24 22:44:31 +00:00
Matthias Clasen 532a1c6d0d Replace move-focus signal by focus.move action 2019-06-24 22:44:31 +00:00
Matthias Clasen d1691c5a48 window: Replace enable-debugging by an action 2019-06-24 22:44:31 +00:00
Matthias Clasen 2002d49871 window: Convert activate-focus to an action 2019-06-24 22:44:31 +00:00
Matthias Clasen 14fd2ccca5 window: Document default.activate 2019-06-24 22:44:31 +00:00
Matthias Clasen 1c34d79a53 window: Drop the activate-default signal
It has been replaced by an action.
2019-06-24 22:44:31 +00:00
Matthias Clasen 3a139453c4 Remove popup-menu signal
We decided not to have generic context menu api,
so this binding is a bit out of place too. Replace
it by bindings in the individual widgets that
have context menus.
2019-06-24 22:44:31 +00:00
Matthias Clasen 3fcfcf51f6 treeview: Avoid popup-menu 2019-06-24 22:44:31 +00:00
Matthias Clasen aa04678239 scrollbar: Avoid popup-menu 2019-06-24 22:44:31 +00:00
Matthias Clasen 0dccb3de40 placesview: Avoid the use of popup-menu 2019-06-24 22:44:31 +00:00
Matthias Clasen f9c670b7c6 mountoperation: Avoid use of popup-menu 2019-06-24 22:40:29 +00:00
Matthias Clasen e40758ec26 file chooser: Avoid use of popup-menu 2019-06-24 22:40:29 +00:00
Matthias Clasen ce19f5a282 color editor: Avoid popup-menu use 2019-06-24 22:40:29 +00:00
Matthias Clasen b050572918 popover: Switch activate-default to an action
This matches what we already did for GtkWindow.
2019-06-24 22:40:29 +00:00
Matthias Clasen f6f8f4b742 shortcutaction: Just use gtk_widget_activate_action
We can just rely on this, no need to do manual
action group juggling here.
2019-06-24 22:40:29 +00:00
Matthias Clasen 318ac2f823 shortcut action: Fix a wrong cast 2019-06-24 22:40:29 +00:00
Matthias Clasen af689a2a5c tests: Skip GtkShortcutsController::model
The defaultvalue test can't handle object-valued
properties with non-NULL initial value.
2019-06-24 22:40:29 +00:00
Matthias Clasen caf73e7211 text: Documentation for actions
Add doc comments to all GtkText actions.

gtk-doc will need to learn to extract action
documentation. This is using a CLASS|action
format to differentiate actions from properties
and signals. For actions with parameters, we
use the normal gtk-doc syntax for arguments.
2019-06-24 22:40:29 +00:00
Matthias Clasen fca13bd00c introspection test: Update
GtkText has some new actions.
2019-06-24 22:40:29 +00:00
Matthias Clasen 6d4fcd9633 widget: Quiet a compiler warning 2019-06-24 22:40:29 +00:00
Matthias Clasen dfd20e037b shortcut trigger: Silence gtk-doc warnings 2019-06-24 22:40:29 +00:00
Matthias Clasen d9b771aa7f shortcut controller: Silence gtk-doc warnings 2019-06-24 22:40:29 +00:00
Matthias Clasen 7873f5c4eb shortcut action: Silence gtk-doc warnings 2019-06-24 22:40:29 +00:00
Matthias Clasen 60479bedae password entry: Silence gtk-doc warnings 2019-06-24 22:40:29 +00:00
Matthias Clasen 6b632ca139 entry: Silence gtk-doc warnings 2019-06-24 22:40:29 +00:00
Matthias Clasen a92ab66024 docs: Make the shooter build again 2019-06-24 22:40:29 +00:00
Matthias Clasen 8ab76574cd Redo default activation in entries
Remove the activates-default property in GtkText
and move this functionality to the entry wrapper
classes instead. Add an activate action and
bindings where necessary.

With this, GtkText is completely converted from
keybinding signals to actions.
2019-06-24 22:40:29 +00:00
Matthias Clasen 21e9fc054e text: Drop keybinding signals
These are not used anymore.
2019-06-24 22:40:29 +00:00
Matthias Clasen 1cbb2099a2 text: Stop using keybinding signals internally
We can just call the class handlers.
2019-06-24 22:40:29 +00:00
Matthias Clasen 7ed27ef574 text: Convert bindings to actions 2019-06-24 22:40:29 +00:00
Matthias Clasen 9039d0b0c1 text: Add more actions
These will let us port more bindings to actions.
2019-06-24 22:40:29 +00:00
Matthias Clasen 00e68fcae2 widget: Unset propagation limits for shortcut managers
These controllers are meant to be global and
thus should be able to react to events that are
getting routed to open popovers. This makes
shortcuts in open popover menus work.
2019-06-24 22:40:29 +00:00
Matthias Clasen 9038b7a8c5 widget_factory: Stop using GtkApplication for accels
We want to replace the accels APIs in GtkApplication
with shortcut controllers.
2019-06-24 22:40:29 +00:00
Matthias Clasen 0a7f5f1be1 text: Convert bindings from signals to actions
With this change, the context menu picks up the
accels for the actions. The conversion is not
complete, since we don't have actions for all
bindings yet.
2019-06-24 22:40:29 +00:00
Matthias Clasen 70597de0a5 widget: Pass shortcuts to the action muxer
Send the shortcuts used by shortcut managers
and the per-class shortcuts to the action muxer
for associating accels with actions. The
action muxer has existing machinery for propagating
accels to the UI.
2019-06-24 22:40:29 +00:00
Matthias Clasen 75b19169cf action muxer: Support injecting shortcuts
Give the action muxer an api to add list models
of shortcuts to draw accels from.
2019-06-24 22:40:29 +00:00
Matthias Clasen 390ba974df model button: Drop accel lookup hack
We were just cutting through to the application
at map time in a last-ditch effort to find
an accel to display. Drop that and just rely on
the menu tracker to give us the right thing.
2019-06-24 22:40:29 +00:00
Matthias Clasen d9167fc8d6 model button: Stop parsing accels
The new shortcuts machinery gives us formatted
strings, so just use them as-is without parsing
and reformatting.
2019-06-24 22:40:29 +00:00
Matthias Clasen d000bed15f popover menu: Make mnemonics visible
For menus, mnemonics trigger without pressing Alt,
and the expectation is that we show them whenever
keynav is happening. Reinstate this behavior for
popover menus.
2019-06-24 22:40:29 +00:00
Matthias Clasen b1ac7b667c popover menu: Implement shortcut manager
And make mnemonics trigger without Alt,
like we already do for GtkMenu.
2019-06-24 22:40:29 +00:00
Matthias Clasen b89dee2f56 shortcut controller: Factor out a helper
No need to have the same code in multiple places.
2019-06-24 22:40:29 +00:00
Matthias Clasen 0f75f33857 Implement group cycling
When more than one shortcut can trigger,
activate them non-exclusively, round-robin.
2019-06-24 22:40:29 +00:00
Matthias Clasen f41931f527 label: Remove mnemonics when unmapped
We never want mnemonics to trigger when the user
can't see them, so remove them from the shortcuts
manager.
2019-06-24 22:40:29 +00:00
Matthias Clasen fa8ffa6d6c Set names on shortcut controllers 2019-06-24 22:40:29 +00:00
Matthias Clasen b2be6db1ed inspector: Show owners for shortcuts
This is somewhat preliminary, but it helps
debugging shortcuts. It suffers from not having
the right list model apis to do this.

Eventually, this should become a link to the
object details.
2019-06-24 22:40:29 +00:00
Matthias Clasen 949afa598a inspector: Add a quick shortcuts page
This shows the shortcuts for a GtkShortcutController
object.
2019-06-24 22:40:29 +00:00
Matthias Clasen 56bc921586 inspector: Show shortcut actions and triggers
Show these in the property details for
GtkShortcut objects.
2019-06-24 22:40:29 +00:00
Matthias Clasen d0509d5afc shortcut controller: Make model readable
We want to show the shortcuts in the inspector,
so we need to be able to get at the model.
2019-06-24 22:40:29 +00:00
Matthias Clasen a9c0548179 window: Use gtk_widget_class_bind_action
Use gtk_widget_class_bind_action for default.activate.
2019-06-24 22:40:29 +00:00
Matthias Clasen 79c5398690 Add gtk_widget_class_bind_action
Similar to gtk_widget_class_add_binding_signal,
but triggers an action.
2019-06-24 22:40:29 +00:00
Georges Basile Stavracas Neto 26d310fb07 shortcutcontroller: Unref shortcut proper
g_list_model_get_item() is transfer full, so we need to
unref everything that is acquired through it.
2019-06-24 22:40:29 +00:00
Georges Basile Stavracas Neto 1787bf5471 shortcuttrigger: Filter a few modifiers out
Copying the code from GtkKeyHash, filter out X11 modifiers and
Caps Lock from events. Unfortunately, legacy X11 modifiers can
be present even when running full Wayland, due to XKB.
2019-06-24 22:40:29 +00:00
Benjamin Otte 2ace9aef5f filechooser: Trigger the location popup via bindings
Simplifies code quite a bit.
2019-06-24 22:40:29 +00:00
Benjamin Otte b46e7f1108 filechooser: Remove outdated hack
In GTK2, the filechooser was using a Paned, so switching between sidebar
and files list with the arrow keys didn't work (the slider would be
selected instead). So in
https://bugzilla.gnome.org/show_bug.cgi?id=161489 a crude hack was added
to make this possible.

Over the years the filechooser code has changed so that it now would do
this by default, yet the hack had been retained.
2019-06-24 22:40:29 +00:00
Benjamin Otte cedb413600 accels: Remove GtkAccelGroup 2019-06-24 22:40:29 +00:00
Benjamin Otte f0b41b181d testmenubutton: Don't create a GtkAccelGroup
It's unused.
2019-06-24 22:40:29 +00:00
Benjamin Otte 9c46eb4398 testsuite: Remove GtkAccelGroup usage 2019-06-24 22:40:29 +00:00
Benjamin Otte 2aa9c0ddc1 doc tools: Create AccelLabel image without using GtkAccelGroup 2019-06-24 22:40:29 +00:00
Benjamin Otte ba9fc7aead widget: Remove gtk_widget_add_accelerator()
People should use shortcut controllers instead (global, capture).

A side effect of this is that GtkMenuItem (or rather: GtkAccelLabel) now
lost its method to magically look up accelerators to display. Somebody
needs to add that back later.
2019-06-24 22:40:29 +00:00
Benjamin Otte 0a77a4a264 testgtk: Port keyval example to shortcut controllers 2019-06-24 22:40:29 +00:00
Benjamin Otte 0b21d6a01c gtk-demo: Redo builder example to use shortcuts
Now that shortcuts and controllers are supported by GtkBuilder, demo
how all of that works.
2019-06-24 22:40:29 +00:00
Benjamin Otte 21e4f5353b shortcutcontroller: Implement GtkBuildable
Use it to allow adding shortcuts to the controller via the usual <child>
method.
2019-06-24 22:40:29 +00:00
Benjamin Otte 16583da221 shortcutaction: Integrate with GtkBuilder property parsing
<property name="action">action(win.quit)</property> style action
specifications now work for GtkShortcutAction properties.
2019-06-24 22:40:29 +00:00
Benjamin Otte ee88c6863e shortcuttrigger: Add gtk_shortcut_triger_new_parse_string()
And hook it up into the GtkBuilder infrastructure.
2019-06-24 22:40:29 +00:00
Benjamin Otte 112a8d1037 application: Replace accelerator handling with shortcuts
API remains the same, but activation is now done via a
shortcutcontroller.

The code uses a controller with global scope so that the shortcuts are
managed with all the other global shortcuts.
2019-06-24 22:40:29 +00:00
Benjamin Otte 28a1e44833 accel: Add display arg to gtk_accelerator_parse_with_keycode()
It was using the default display unconditionally.
2019-06-24 22:40:29 +00:00
Benjamin Otte d273fb63ec accelerators: Make gtk_accelerator_parse() return TRUE/FALSE
A parse function should return success or not. So do that.
2019-06-24 22:40:29 +00:00
Benjamin Otte 4ac2f95688 shortcuttrigger: Add hash(), equal(), and compare() functions
Those are useful for putting triggers in hash tables or getting sorted
output.
2019-06-24 22:40:28 +00:00
Benjamin Otte d38791473a shortcuts: Mananage managed shortcuts with a custom model
Reduce the amount of special casing by using a ListModel for global and
managed shortcuts, too.

This way, the ListModel API will work for the ShortcutController in the
GtkShortcutManager and GtkRoot.

The only special case remaining is shortcut activation, which needs to
pass the right widget to the controller in the global/managed case.
2019-06-24 22:40:28 +00:00
Benjamin Otte c5b2bb06be gdk: Make gdk_keyval_name() return a const char
The string is const, so return it like that.
2019-06-24 22:40:28 +00:00
Benjamin Otte 6a75fdf732 shortcutaction: Add gtk_shortcut_action_to_string()
For all but the callback action, we can print something useful.
2019-06-24 22:40:28 +00:00
Benjamin Otte dd1b65d522 widget: Keep keybindings as a GListStore
This way, we can use shortcut_controller_new_for_model() and avoid all
the special casing about run_class.
2019-06-24 22:40:28 +00:00
Benjamin Otte 40264629f7 shortcutcontroller: Add gtk_shortcut_controller_new_for_model()
This is mainly for internal use, but I can't see a reason to not have it
public for people who want to maintain their own lists.

I'm sure gnome-builder will never ever find a way to misuse it.
2019-06-24 22:40:28 +00:00
Benjamin Otte 740fe4f7ce shortcutcontroller: Implement GListModel
After all, this controller is a list of shortcuts.
2019-06-24 22:40:28 +00:00
Benjamin Otte 7fffbccbde gtk-demo: Port the sliding puzzle demo to shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 10ff0bc959 shortcut: Change the API for creating shortcuts
When creating shortcuts, there almost always are a trigger and an action
available for use. So make gtk_shortcut_new() take those as arguments.

Also add gtk_shortcut_new_with_arguments() so people can easily pass
those in, too.
2019-06-24 22:40:28 +00:00
Benjamin Otte c336ebdaae shortcut: Add GtkShortcutAction
Similar to GtkShortcutTrigger, GtkShortCutAction provides all the
different ways to activate a shortcut.

So far, these different ways are supported:
- do nothing
- Call a user-provided callback
- Call gtk_widget_activate()
- Call gtk_widget_mnemonic_activate()
- Emit an action signal
- Activate an action from the widget's action muxer
- Activate a GAction
2019-06-24 22:40:28 +00:00
Benjamin Otte 4d6d5d3fe5 accelgroup: Remove unneeded APIs
After the removal of GtkAccelMap, these things are no longer necessary.
2019-06-24 22:40:28 +00:00
Benjamin Otte edf1023f5c gtk: Remove GtkAccelMap
Now that accel paths are gone, the object managing them isn't needed
anymore either.
2019-06-24 22:40:28 +00:00
Benjamin Otte 41a9786b51 gtk: Remove accel paths
It's an outdated technology now that everybody is using GActionGroups.

If somebody wanted to support changeable shortcuts, they'd need to
reintroduce it in another way.
2019-06-24 22:40:28 +00:00
Benjamin Otte 97cdd92233 menushell: Remove old mnemonic handling
It's not used anymore.

This was also the last user of GtkMnemonicHash, so delete that one, too.
2019-06-24 22:40:28 +00:00
Benjamin Otte ba70b22ab1 window: Remove all old mnemonic handling API 2019-06-24 22:40:28 +00:00
Benjamin Otte 500bee4a25 menu: Implement GtkShortcutManager
And make sure to activate mnemonics without Alt
2019-06-24 22:40:28 +00:00
Benjamin Otte c551279ec7 shortcutmanager: Add
This adds an interface for taking care of shortcut controllers with
managed scope.

GtkRoot requires this interface, where it's also used for global
controllers and to ensure that managed scope always finds a parent that
is a shortcut manager.

No widget that isn't a root implements the interface yet.
2019-06-24 22:40:28 +00:00
Benjamin Otte 6b4b1a0ba3 label: Implement mnemonics using shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 635299fff1 shortcut: Add gtk_shortcut_set_mnemonic_activate()
Makes the shortcut call gtk_widget_mnemonic_activate() upon activation.
2019-06-24 22:40:28 +00:00
Benjamin Otte 46179898cf shortcuttrigger: Add support for mnemonics
Mnemonics need to be triggered with help from the controllers (who
determine the modifiers). Support for that has been added, too.

Mnemonics do not use this yet though.
2019-06-24 22:40:28 +00:00
Benjamin Otte d977797d87 window: Put F10 accelerator into its own shortcut controller
So instead of relying on gtk_window_activate_key(), it's now using
proper infrastructure.
2019-06-24 22:40:28 +00:00
Benjamin Otte d9320b923d window: Get rid of public APIs that shouldn't be
Event controllers should have replaced all of them. And if they haven't,
apps need to fix their code (I'm looking at you Gimp).
2019-06-24 22:40:28 +00:00
Benjamin Otte bd2dc9f299 gdk: Remove GDK_RELEASE_MASK
It was only ever supported by keybindings and those are gone now.
2019-06-24 22:40:28 +00:00
Benjamin Otte d1711f4953 gtk-demo: Add a dumb demo for shortcut triggers 2019-06-24 22:40:28 +00:00
Benjamin Otte 8462b4f322 shortcutcontroller: Add GtkShortcutScope
Allow setting the scope for a controller. The scope determines at what
point in event propagation the shortcuts will be activated.

Local scope is the usual activation, global scope means that the root
widget activates the shortcuts - ie they are activated at the very
start of event propagation (for global capture events) or the very end
(for global bubble events).
Managed scope so far is unimplemented.

This is supposed to be used to replace accelerators and mnemonics.
2019-06-24 22:40:28 +00:00
Benjamin Otte cee07a218d shortcuttrigger: Add gtk_shortcut_trigger_to_label()
Provide a user-presentable string.
2019-06-24 22:40:28 +00:00
Benjamin Otte 8270a0c751 accelgroup: Add gtk_accel_group_print_label() 2019-06-24 22:40:28 +00:00
Benjamin Otte 4bbeb36afe accellabel: Move gtk_accelerator_get_label() code
The function lives in gtkaccelgroup.c, so there's no need to have that
call a private function in another source file. Instead, make that
other source file call gtk_accelerator_get_label() instead.
2019-06-24 22:40:28 +00:00
Benjamin Otte 9acfc58fc4 accellabel: Get rid of class variables
We can just look them up as-needed, no need to cache them.
2019-06-24 22:40:28 +00:00
Matthias Clasen 757ccb65df model button: Use simpler api for accels 2019-06-24 22:40:28 +00:00
Benjamin Otte fd0a0c0da6 gtk: Remove bindings
The whole binding functionality is now handled by shortcuts.
2019-06-24 22:40:28 +00:00
Matthias Clasen 7685d8fdd8 popovermenu: Port away from GtkBindings 2019-06-24 22:40:28 +00:00
Georges Basile Stavracas Neto 8a0607bc4e eventcontrollerkey: Remove binding handling 2019-06-24 22:40:28 +00:00
Georges Basile Stavracas Neto 0aa6898e54 passwordentry: Remove unused header 2019-06-24 22:40:28 +00:00
Benjamin Otte b0f971b45a accelgroup: Actually have a default mod mask
Don't just use a value without initializing it.
2019-06-24 22:40:28 +00:00
Benjamin Otte b902beaf42 treeview: Redo event forwarding hack
Reorder the event controllers so that key forwarding to the search
entries really happens after shortcut triggering.
2019-06-24 22:40:28 +00:00
Benjamin Otte 6f57b1fb5f combobox: Redo key event forwarding hack
Instead of manualling invoking bindings, we now reorder event
controllers inside the treemenu, so that shortcuts run before the event
forwarding.
2019-06-24 22:40:28 +00:00
Benjamin Otte 0a1b472b40 iconview: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 5172ccaf64 infobar: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte e623561d94 label: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 5a1719c719 listbox: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 58c3be5dfb menubar: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte a3cb40832e menu: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 603da7b432 menushell: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 95c7669a96 notebook: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 2774f9ab9f scale: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 0e875859aa scalebutton: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 042ad688eb scrolledwindow: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 25519ae3fa searchentry: Port bindings to use shortcuts 2019-06-24 22:40:28 +00:00
Benjamin Otte 484a20709e shortcutssection: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte c1f6dd6f0a shortcutswindow: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte b10e31985a flowbox: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte a55af731f0 paned: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 52ff060527 spinbutton: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 11e132d8e0 textview: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte da0465ec27 filechooserwidget: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 27a60f76fc toolbar: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 232f4a8503 shortcutcontroller: Add gtk_shortcut_controller_add_shortcut()
... and gtk_shortcut_controller_remove_shortcut().
2019-06-24 22:40:27 +00:00
Benjamin Otte bb0343ecc8 shortcutcontroller: Add private API for running class shortcuts
We don't want regular users to be able to run class shortcuts in their
controllers, so we have to special case that.
2019-06-24 22:40:27 +00:00
Benjamin Otte f8638c7fc9 treeview: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 571320a198 widget: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 8c256ab36a dialog: Port binding to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte dfba621d80 text: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 80ecccf6ba shortcut: Add gtk_shortcut_set_callback()
... and gtk_widget_class_add_binding() to go with it.

This allows shortcuts to invoke manually added callbacks.
2019-06-24 22:40:27 +00:00
Benjamin Otte 47d348a6de combobox: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte 778a60fa2c assistant: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte fbaba0026a trigger: Add an alternative trigger
And use it.

I just added it to GtkWidget just to show that I can.
The real reason I want it is for gamepad/joystick triggers in games,
so that it becomes possible to select 2 different triggers (gamepad and
keyboard) for the same shortcut.
2019-06-24 22:40:27 +00:00
Benjamin Otte e8aba7d8b9 shortcut: Add GtkShortcutTrigger
Triggers are meant to describe how to trigger a shortcut. So far only a
keyval + modifiers trigger exists.
2019-06-24 22:40:27 +00:00
Benjamin Otte fc9ff92096 window: Port bindings to use shortcuts 2019-06-24 22:40:27 +00:00
Benjamin Otte f80d664c0d bindings: Add more variant types
Also marshal types that the code in gtkbindings.c doesn't use. These
will be used by gtk_widget_class_add_binding_signal().
2019-06-24 22:40:27 +00:00
Benjamin Otte ec641ebcab widget: Add gtk_widget_class_add_shortcut()
This allows adding shortcuts as a replacement for keybindings.
2019-06-24 22:40:27 +00:00
Benjamin Otte 8b96ce4e8b gtk: Add GtkShortcut
This is the base class for what is about to take over all sorts of
keyboard shortcuts. The initial version barely deals with keybindings.
2019-06-24 22:40:27 +00:00
Benjamin Otte 504e203a1d bindings: Split out function to invoke an action signal
We want to use that in shortcuts later.
2019-06-24 22:40:27 +00:00
Benjamin Otte 435ff1012f shortcutcontroller: Introduce
This is a very barebones controller that currently does nothing but
activate the binding signals. Yay.

And because we have bindings on every widget (Yes, a GtkGrid has a
keybinding - 2 in fact), we need that controller everywhere.
2019-06-24 22:40:27 +00:00
Benjamin Otte 83bfc8d9f2 bindings: Make gtk_binding_parse_signal() use GVariantBuilder
And because it's the last user of GtkBindingArg and
gtk_binding_entry_add_signall(), also remove those two.
2019-06-24 22:40:27 +00:00
Benjamin Otte 0e4bbb18f3 bindings: Parse into GVariantBuilder directly
Avoids the indirection via GtkBindingArg
2019-06-24 22:40:27 +00:00
Benjamin Otte 935c03c8a0 bindings: Add gtk_binding_entry_add_signal_variant()
This function is the replacement for
gtk_binding_entry_add_signall().

The GVariant will be demarshalled and passed to the action signal upon
binding activation. The same rules apply as used to apply for
GtkBindingArg, in that long, double and string args are now replaced by
"x", "d" and "s" variant types.
2019-06-24 22:40:27 +00:00
Benjamin Otte 77ef644c7c bindings: Replace GtkBindingArg arguments with GVariant
This only replaces invocation, not yet parsing.
2019-06-24 22:40:27 +00:00
Georges Basile Stavracas Neto fd9d7c67d5 widget: Bring back _gtk_widget_list_controllers()
Will be used by shourtcuts.
2019-06-24 22:40:27 +00:00
150 changed files with 9020 additions and 10151 deletions
+18 -43
View File
@@ -31,17 +31,27 @@ about_activate (GSimpleAction *action,
}
static void
help_activate (GSimpleAction *action,
menu_activate (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
g_print ("Help not available\n");
g_print ("%s action not available\n", g_action_get_name (G_ACTION (action)));
}
static GActionEntry win_entries[] = {
{ "quit", quit_activate, NULL, NULL, NULL },
{ "about", about_activate, NULL, NULL, NULL },
{ "help", help_activate, NULL, NULL, NULL }
{ "help", menu_activate, NULL, NULL, NULL }
};
static GActionEntry menu_entries[] = {
{ "new", menu_activate, NULL, NULL, NULL },
{ "open", menu_activate, NULL, NULL, NULL },
{ "save", menu_activate, NULL, NULL, NULL },
{ "save_as", menu_activate, NULL, NULL, NULL },
{ "copy", menu_activate, NULL, NULL, NULL },
{ "cut", menu_activate, NULL, NULL, NULL },
{ "paste", menu_activate, NULL, NULL, NULL },
};
GtkWidget *
@@ -50,8 +60,6 @@ do_builder (GtkWidget *do_widget)
static GtkWidget *window = NULL;
GtkWidget *toolbar;
GActionGroup *actions;
GtkAccelGroup *accel_group;
GtkWidget *item;
if (!window)
{
@@ -73,44 +81,11 @@ do_builder (GtkWidget *do_widget)
win_entries, G_N_ELEMENTS (win_entries),
window);
gtk_widget_insert_action_group (window, "win", actions);
accel_group = gtk_accel_group_new ();
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
item = (GtkWidget*)gtk_builder_get_object (builder, "new_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_n, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "open_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_o, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "save_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "quit_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "copy_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_c, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "cut_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_x, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "paste_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_v, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "help_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_F1, 0, GTK_ACCEL_VISIBLE);
item = (GtkWidget*)gtk_builder_get_object (builder, "about_item");
gtk_widget_add_accelerator (item, "activate", accel_group,
GDK_KEY_F7, 0, GTK_ACCEL_VISIBLE);
actions = (GActionGroup*)g_simple_action_group_new ();
g_action_map_add_action_entries (G_ACTION_MAP (actions),
menu_entries, G_N_ELEMENTS (menu_entries),
window);
gtk_widget_insert_action_group (window, "menu", actions);
g_object_set_data_full (G_OBJECT(window), "builder", builder, g_object_unref);
}
+1
View File
@@ -204,6 +204,7 @@
<file>search_entry.c</file>
<file>search_entry2.c</file>
<file>shortcuts.c</file>
<file>shortcut_triggers.c</file>
<file>sizegroup.c</file>
<file>sidebar.c</file>
<file>sliding_puzzle.c</file>
+73 -1
View File
@@ -33,6 +33,72 @@
<property name="default-height">250</property>
<property name="default-width">440</property>
<property name="title" translatable="yes">Builder</property>
<child>
<object class="GtkShortcutController" id="controller1">
<property name="scope">global</property>
<property name="propagation-phase">capture</property>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;n</property>
<property name="action">action(menu.new)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;o</property>
<property name="action">action(menu.open)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;s</property>
<property name="action">action(menu.save)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;&lt;Shift&gt;s</property>
<property name="action">action(menu.save_as)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;q</property>
<property name="action">action(win.quit)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;c</property>
<property name="action">action(menu.copy)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;x</property>
<property name="action">action(menu.cut)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">&lt;Primary&gt;v</property>
<property name="action">action(menu.paste)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">F1</property>
<property name="action">action(win.help)</property>
</object>
</child>
<child>
<object class="GtkShortcut">
<property name="trigger">F7</property>
<property name="action">action(win.about)</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="vbox1">
<property name="orientation">vertical</property>
@@ -53,25 +119,28 @@
<object class="GtkMenuItem" id="new_item">
<property name="label" translatable="yes">_New</property>
<property name="use-underline">1</property>
<property name="action-name">menu.new</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="open_item">
<property name="label" translatable="yes">_Open</property>
<property name="use-underline">1</property>
<property name="action-name">menu.open</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="save_item">
<property name="label" translatable="yes">_Save</property>
<property name="use-underline">1</property>
<property name="action-name">menu.save</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="save_as_item">
<property name="label" translatable="yes">Save _As</property>
<property name="use-underline">1</property>
<accelerator key="s" modifiers="primary | shift-mask" signal="activate"/>
<property name="action-name">menu.save_as</property>
</object>
</child>
<child>
@@ -98,18 +167,21 @@
<object class="GtkMenuItem" id="copy_item">
<property name="label" translatable="yes">_Copy</property>
<property name="use-underline">1</property>
<property name="action-name">menu.copy</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="cut_item">
<property name="label" translatable="yes">_Cut</property>
<property name="use-underline">1</property>
<property name="action-name">menu.cut</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="paste_item">
<property name="label" translatable="yes">_Paste</property>
<property name="use-underline">1</property>
<property name="action-name">menu.paste</property>
</object>
</child>
</object>
-1
View File
@@ -310,7 +310,6 @@ static gchar *types[] =
"GtkIconView ",
"GtkCellRendererText ",
"GtkContainer ",
"GtkAccelGroup ",
"GtkPaned ",
"GtkPrintOperation ",
"GtkPrintContext ",
-4
View File
@@ -87,7 +87,6 @@ do_menus (GtkWidget *do_widget)
GtkWidget *menubar;
GtkWidget *menu;
GtkWidget *menuitem;
GtkAccelGroup *accel_group;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window),
@@ -96,9 +95,6 @@ do_menus (GtkWidget *do_widget)
g_signal_connect (window, "destroy",
G_CALLBACK(gtk_widget_destroyed), &window);
accel_group = gtk_accel_group_new ();
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add (GTK_CONTAINER (window), box);
+1
View File
@@ -59,6 +59,7 @@ demos = files([
'search_entry.c',
'search_entry2.c',
'shortcuts.c',
'shortcut_triggers.c',
'sidebar.c',
'sizegroup.c',
'sliding_puzzle.c',
+91
View File
@@ -0,0 +1,91 @@
/* Shortcuts
*
* GtkShortcut is the abstraction used by GTK to handle shortcuts from
* keyboard or other input devices.
*
* Shortcut triggers can be used to weave complex sequences of key
* presses into sophisticated mechanisms to activate shortcuts.
*
* This demo code shows creative ways to do that.
*/
#include <gtk/gtk.h>
static GtkWidget *window = NULL;
static gboolean
shortcut_activated (GtkWidget *window,
GVariant *unused,
gpointer row)
{
g_print ("activated %s\n", gtk_label_get_label (row));
return TRUE;
}
static GtkShortcutTrigger *
create_ctrl_g (void)
{
return gtk_keyval_trigger_new (GDK_KEY_g, GDK_CONTROL_MASK);
}
static GtkShortcutTrigger *
create_x (void)
{
return gtk_keyval_trigger_new (GDK_KEY_x, 0);
}
struct {
char *description;
GtkShortcutTrigger * (* create_trigger_func) (void);
} shortcuts[] = {
{ "Press Ctrl-G", create_ctrl_g },
{ "Press X", create_x },
};
GtkWidget *
do_shortcut_triggers (GtkWidget *do_widget)
{
guint i;
if (!window)
{
GtkWidget *list;
GtkEventController *controller;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Shortcuts");
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
list = gtk_list_box_new ();
g_object_set (list, "margin", 6, NULL);
gtk_container_add (GTK_CONTAINER (window), list);
for (i = 0; i < G_N_ELEMENTS (shortcuts); i++)
{
GtkShortcut *shortcut;
GtkWidget *row;
row = gtk_label_new (shortcuts[i].description);
gtk_container_add (GTK_CONTAINER (list), row);
controller = gtk_shortcut_controller_new ();
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller), GTK_SHORTCUT_SCOPE_GLOBAL);
gtk_widget_add_controller (row, controller);
shortcut = gtk_shortcut_new (shortcuts[i].create_trigger_func(),
gtk_callback_action_new (shortcut_activated, row, NULL));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
}
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_widget_destroy (window);
return window;
}
+36 -43
View File
@@ -160,47 +160,13 @@ check_solved (GtkWidget *grid)
}
static gboolean
puzzle_key_pressed (GtkEventControllerKey *controller,
guint keyval,
guint keycode,
GdkModifierType state,
GtkWidget *grid)
puzzle_key_pressed (GtkWidget *grid,
GVariant *args,
gpointer unused)
{
int dx, dy;
dx = 0;
dy = 0;
switch (keyval)
{
case GDK_KEY_KP_Left:
case GDK_KEY_Left:
/* left */
dx = -1;
break;
case GDK_KEY_KP_Up:
case GDK_KEY_Up:
/* up */
dy = -1;
break;
case GDK_KEY_KP_Right:
case GDK_KEY_Right:
/* right */
dx = 1;
break;
case GDK_KEY_KP_Down:
case GDK_KEY_Down:
/* down */
dy = 1;
break;
default:
/* We return FALSE here because we didn't handle the key that was pressed */
return FALSE;
}
g_variant_get (args, "(ii)", &dx, &dy);
if (!move_puzzle (grid, dx, dy))
{
@@ -276,6 +242,24 @@ puzzle_button_pressed (GtkGestureClick *gesture,
}
}
static void
add_move_binding (GtkShortcutController *controller,
guint keyval,
guint kp_keyval,
int dx,
int dy)
{
GtkShortcut *shortcut;
shortcut = gtk_shortcut_new_with_arguments (
gtk_alternative_trigger_new (gtk_keyval_trigger_new (keyval, 0),
gtk_keyval_trigger_new (kp_keyval, 0)),
gtk_callback_action_new (puzzle_key_pressed, NULL, NULL),
"(ii)", dx, dy);
gtk_shortcut_controller_add_shortcut (controller, shortcut);
g_object_unref (shortcut);
}
static void
start_puzzle (GdkPaintable *puzzle)
{
@@ -298,12 +282,21 @@ start_puzzle (GdkPaintable *puzzle)
aspect_ratio = 1.0;
gtk_aspect_frame_set (GTK_ASPECT_FRAME (frame), 0.5, 0.5, aspect_ratio, FALSE);
/* Add a key event controller so people can use the arrow
/* Add shortcuts so people can use the arrow
* keys to move the puzzle */
controller = gtk_event_controller_key_new ();
g_signal_connect (controller, "key-pressed",
G_CALLBACK (puzzle_key_pressed),
grid);
controller = gtk_shortcut_controller_new ();
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
GDK_KEY_Left, GDK_KEY_KP_Left,
-1, 0);
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
GDK_KEY_Right, GDK_KEY_KP_Right,
1, 0);
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
GDK_KEY_Up, GDK_KEY_KP_Up,
0, -1);
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
GDK_KEY_Down, GDK_KEY_KP_Down,
0, 1);
gtk_widget_add_controller (GTK_WIDGET (grid), controller);
controller = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ());
+44 -19
View File
@@ -1050,25 +1050,33 @@ row_activated (GtkListBox *box, GtkListBoxRow *row)
}
}
typedef struct {
const gchar *action_and_target;
const gchar *accelerators[2];
} Accel;
static void
set_accel (GtkApplication *app, GtkWidget *widget)
set_accel (GtkWidget *widget, Accel *accels, int n_accels)
{
GtkWidget *accel_label;
const gchar *action;
gchar **accels;
guint key;
GdkModifierType mods;
int i;
accel_label = gtk_bin_get_child (GTK_BIN (widget));
g_assert (GTK_IS_ACCEL_LABEL (accel_label));
action = gtk_actionable_get_action_name (GTK_ACTIONABLE (widget));
accels = gtk_application_get_accels_for_action (app, action);
gtk_accelerator_parse (accels[0], &key, &mods);
gtk_accel_label_set_accel (GTK_ACCEL_LABEL (accel_label), key, mods);
g_strfreev (accels);
for (i = 0; i < n_accels; i++)
{
if (strcmp (accels[i].action_and_target, action) == 0)
{
if (gtk_accelerator_parse (accels[i].accelerators[0], &key, &mods))
gtk_accel_label_set_accel (GTK_ACCEL_LABEL (accel_label), key, mods);
break;
}
}
}
typedef struct
@@ -1679,10 +1687,7 @@ activate (GApplication *app)
{ "record", activate_record, NULL, NULL, NULL },
{ "lock", activate_lock, NULL, NULL, NULL },
};
struct {
const gchar *action_and_target;
const gchar *accelerators[2];
} accels[] = {
Accel accels[] = {
{ "app.about", { "F1", NULL } },
{ "app.quit", { "<Primary>q", NULL } },
{ "app.open-in", { "<Primary>n", NULL } },
@@ -1700,6 +1705,7 @@ activate (GApplication *app)
gint i;
GPermission *permission;
GAction *action;
GtkEventController *controller;
g_type_ensure (my_text_view_get_type ());
@@ -1734,8 +1740,27 @@ activate (GApplication *app)
win_entries, G_N_ELEMENTS (win_entries),
window);
controller = gtk_shortcut_controller_new ();
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller),
GTK_SHORTCUT_SCOPE_GLOBAL);
for (i = 0; i < G_N_ELEMENTS (accels); i++)
gtk_application_set_accels_for_action (GTK_APPLICATION (app), accels[i].action_and_target, accels[i].accelerators);
{
GtkShortcutTrigger *trigger;
GtkShortcutAction *action;
GtkShortcut *shortcut;
guint keyval;
GdkModifierType modifiers;
gtk_accelerator_parse (accels[i].accelerators[0], &keyval, &modifiers);
trigger = gtk_keyval_trigger_new (keyval, modifiers);
action = gtk_action_action_new (accels[i].action_and_target);
shortcut = gtk_shortcut_new (trigger, action);
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
g_object_unref (shortcut);
}
gtk_widget_add_controller (GTK_WIDGET (window), controller);
widget = (GtkWidget *)gtk_builder_get_object (builder, "statusbar");
gtk_statusbar_push (GTK_STATUSBAR (widget), 0, "All systems are operating normally.");
@@ -1855,12 +1880,12 @@ activate (GApplication *app)
g_object_set_data (G_OBJECT (widget2), "range_to_spin", widget3);
g_object_set_data (G_OBJECT (widget), "print_button", widget4);
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "quitmenuitem")));
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "deletemenuitem")));
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "searchmenuitem")));
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "darkmenuitem")));
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "aboutmenuitem")));
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "bgmenuitem")));
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "quitmenuitem")), accels, G_N_ELEMENTS (accels));
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "deletemenuitem")), accels, G_N_ELEMENTS (accels));
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "searchmenuitem")), accels, G_N_ELEMENTS (accels));
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "darkmenuitem")), accels, G_N_ELEMENTS (accels));
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "aboutmenuitem")), accels, G_N_ELEMENTS (accels));
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "bgmenuitem")), accels, G_N_ELEMENTS (accels));
widget2 = (GtkWidget *)gtk_builder_get_object (builder, "tooltextview");
+7 -3
View File
@@ -342,17 +342,21 @@
<xi:include href="xml/gtkpadcontroller.xml" />
</chapter>
<chapter>
<title>Keyboard shortcuts</title>
<xi:include href="xml/gtkshortcutcontroller.xml" />
<xi:include href="xml/gtkshortcut.xml" />
<xi:include href="xml/gtkshortcuttrigger.xml" />
<xi:include href="xml/gtkshortcutaction.xml" />
</chapter>
</part>
<part id="gtkbase">
<title>GTK Core Reference</title>
<xi:include href="xml/gtkmain.xml" />
<xi:include href="xml/gtkfeatures.xml" />
<xi:include href="xml/gtkaccelgroup.xml" />
<xi:include href="xml/gtkaccelmap.xml" />
<xi:include href="xml/gtkdnd.xml" />
<xi:include href="xml/gtksettings.xml" />
<xi:include href="xml/gtkbindings.xml" />
<xi:include href="xml/gtkenums.xml" />
<xi:include href="xml/gtkselection.xml" />
<xi:include href="xml/gtktesting.xml" />
+135 -107
View File
@@ -53,26 +53,6 @@ gtk_about_dialog_get_type
<SECTION>
<FILE>gtkaccelgroup</FILE>
<TITLE>Keyboard Accelerators</TITLE>
GtkAccelGroup
GtkAccelGroupClass
gtk_accel_group_new
GtkAccelFlags
gtk_accel_group_connect
gtk_accel_group_connect_by_path
GtkAccelGroupActivate
GtkAccelGroupFindFunc
gtk_accel_group_disconnect
gtk_accel_group_disconnect_key
gtk_accel_group_activate
gtk_accel_group_lock
gtk_accel_group_unlock
gtk_accel_group_get_is_locked
gtk_accel_group_from_accel_closure
gtk_accel_group_get_modifier_mask
gtk_accel_groups_activate
gtk_accel_groups_from_object
gtk_accel_group_find
GtkAccelKey
gtk_accelerator_valid
gtk_accelerator_parse
gtk_accelerator_name
@@ -82,52 +62,6 @@ gtk_accelerator_name_with_keycode
gtk_accelerator_get_label_with_keycode
gtk_accelerator_set_default_mod_mask
gtk_accelerator_get_default_mod_mask
<SUBSECTION Standard>
GTK_TYPE_ACCEL_GROUP
GTK_ACCEL_GROUP
GTK_IS_ACCEL_GROUP
GTK_ACCEL_GROUP_CLASS
GTK_IS_ACCEL_GROUP_CLASS
GTK_ACCEL_GROUP_GET_CLASS
<SUBSECTION Private>
GTK_ACCEL_GROUP_GET_PRIVATE
GtkAccelGroupPrivate
GtkAccelGroupEntry
gtk_accel_group_query
gtk_accel_group_get_type
</SECTION>
<SECTION>
<FILE>gtkaccelmap</FILE>
<TITLE>Accelerator Maps</TITLE>
GtkAccelMap
GtkAccelMapForeach
gtk_accel_map_add_entry
gtk_accel_map_lookup_entry
gtk_accel_map_change_entry
gtk_accel_map_load
gtk_accel_map_save
gtk_accel_map_foreach
gtk_accel_map_load_fd
gtk_accel_map_save_fd
gtk_accel_map_load_scanner
gtk_accel_map_add_filter
gtk_accel_map_foreach_unfiltered
gtk_accel_map_get
gtk_accel_map_lock_path
gtk_accel_map_unlock_path
<SUBSECTION Standard>
GTK_ACCEL_MAP
GTK_TYPE_ACCEL_MAP
GTK_IS_ACCEL_MAP
GTK_ACCEL_MAP_CLASS
GTK_IS_ACCEL_MAP_CLASS
GTK_ACCEL_MAP_GET_CLASS
GtkAccelMapClass
<SUBSECTION Private>
gtk_accel_map_get_type
</SECTION>
<SECTION>
@@ -135,9 +69,6 @@ gtk_accel_map_get_type
<TITLE>GtkAccelLabel</TITLE>
GtkAccelLabel
gtk_accel_label_new
gtk_accel_label_set_accel_closure
gtk_accel_label_get_accel_widget
gtk_accel_label_set_accel_widget
gtk_accel_label_get_accel_width
gtk_accel_label_set_accel
gtk_accel_label_get_accel
@@ -1790,10 +1721,6 @@ gtk_menu_reorder_child
gtk_menu_popup_at_rect
gtk_menu_popup_at_widget
gtk_menu_popup_at_pointer
gtk_menu_set_accel_group
gtk_menu_get_accel_group
gtk_menu_set_accel_path
gtk_menu_get_accel_path
gtk_menu_set_monitor
gtk_menu_get_monitor
gtk_menu_place_on_monitor
@@ -1891,8 +1818,6 @@ gtk_menu_item_get_use_underline
gtk_menu_item_set_use_underline
gtk_menu_item_set_submenu
gtk_menu_item_get_submenu
gtk_menu_item_set_accel_path
gtk_menu_item_get_accel_path
gtk_menu_item_select
gtk_menu_item_deselect
gtk_menu_item_activate
@@ -4441,10 +4366,10 @@ gtk_widget_add_tick_callback
gtk_widget_remove_tick_callback
gtk_widget_size_allocate
gtk_widget_allocate
gtk_widget_add_accelerator
gtk_widget_remove_accelerator
gtk_widget_set_accel_path
gtk_widget_list_accel_closures
gtk_widget_class_add_shortcut
gtk_widget_class_add_binding
gtk_widget_class_add_binding_signal
gtk_widget_class_bind_action
gtk_widget_can_activate_accel
gtk_widget_event
gtk_widget_activate
@@ -4661,8 +4586,6 @@ gtk_window_new
gtk_window_set_title
gtk_window_set_resizable
gtk_window_get_resizable
gtk_window_add_accel_group
gtk_window_remove_accel_group
gtk_window_set_modal
gtk_window_set_default_size
gtk_window_set_hide_on_close
@@ -4675,11 +4598,6 @@ gtk_window_is_active
gtk_window_is_maximized
gtk_window_get_toplevels
gtk_window_list_toplevels
gtk_window_add_mnemonic
gtk_window_remove_mnemonic
gtk_window_mnemonic_activate
gtk_window_activate_key
gtk_window_propagate_key_event
gtk_window_get_focus
gtk_window_set_focus
gtk_window_get_default_widget
@@ -4702,7 +4620,6 @@ gtk_window_begin_resize_drag
gtk_window_begin_move_drag
gtk_window_set_decorated
gtk_window_set_deletable
gtk_window_set_mnemonic_modifier
gtk_window_set_type_hint
gtk_window_set_accept_focus
gtk_window_set_focus_on_map
@@ -4713,7 +4630,6 @@ gtk_window_get_default_icon_name
gtk_window_get_default_size
gtk_window_get_destroy_with_parent
gtk_window_get_icon_name
gtk_window_get_mnemonic_modifier
gtk_window_get_modal
gtk_window_get_size
gtk_window_get_title
@@ -5195,25 +5111,6 @@ gtk_drag_source_add_image_targets
gtk_drag_source_add_uri_targets
</SECTION>
<SECTION>
<FILE>gtkbindings</FILE>
<TITLE>Bindings</TITLE>
GtkBindingSet
GtkBindingEntry
GtkBindingSignal
GtkBindingArg
gtk_binding_set_new
gtk_binding_set_by_class
gtk_binding_set_find
gtk_bindings_activate
gtk_bindings_activate_event
gtk_binding_set_activate
gtk_binding_entry_add_signal
gtk_binding_entry_add_signal_from_string
gtk_binding_entry_skip
gtk_binding_entry_remove
</SECTION>
<SECTION>
<FILE>gtkenums</FILE>
<TITLE>Standard Enumerations</TITLE>
@@ -6690,6 +6587,137 @@ GTK_EVENT_CONTROLLER_MOTION_GET_CLASS
gtk_event_controller_motion_get_type
</SECTION>
<SECTION>
<FILE>gtkshortcuttrigger</FILE>
<TITLE>GtkShortcutTrigger</TITLE>
GtkShortcutTrigger
gtk_shortcut_trigger_ref
gtk_shortcut_trigger_unref
GtkShortcutTriggerType
gtk_shortcut_trigger_get_trigger_type
gtk_shortcut_trigger_parse_string
gtk_shortcut_trigger_trigger
gtk_shortcut_trigger_hash
gtk_shortcut_trigger_equal
gtk_shortcut_trigger_compare
gtk_shortcut_trigger_to_string
gtk_shortcut_trigger_print
gtk_shortcut_trigger_to_label
gtk_shortcut_trigger_print_label
<SUBSECTION>
gtk_keyval_trigger_new
gtk_keyval_trigger_get_modifiers
gtk_keyval_trigger_get_keyval
<SUBSECTION>
gtk_mnemonic_trigger_new
gtk_mnemonic_trigger_get_keyval
<SUBSECTION Private>
gtk_shortcut_trigger_get_type
</SECTION>
<SECTION>
<FILE>gtkshortcutaction</FILE>
<TITLE>GtkShortcutAction</TITLE>
GtkShortcutAction
gtk_shortcut_action_ref
gtk_shortcut_action_unref
GtkShortcutActionType
gtk_shortcut_action_get_action_type
gtk_shortcut_action_to_string
gtk_shortcut_action_print
gtk_shortcut_action_activate
<SUBSECTION>
gtk_nothing_action_new
<SUBSECTION>
gtk_callback_action_new
<SUBSECTION>
gtk_mnemonic_action_new
<SUBSECTION>
gtk_activate_action_new
<SUBSECTION>
gtk_signal_action_new
gtk_signal_action_get_signal_name
<SUBSECTION>
gtk_action_action_new
gtk_action_action_get_name
<SUBSECTION>
gtk_gaction_action_new
gtk_gaction_action_get_gaction
<SUBSECTION Private>
gtk_shortcut_action_get_type
</SECTION>
<SECTION>
<FILE>gtkshortcut</FILE>
<TITLE>GtkShortcut</TITLE>
GtkShortcut
gtk_shortcut_new
gtk_shortcut_new_with_arguments
gtk_shortcut_get_trigger
gtk_shortcut_set_trigger
gtk_shortcut_get_action
gtk_shortcut_set_action
gtk_shortcut_get_arguments
gtk_shortcut_set_arguments
<SUBSECTION Standard>
GTK_TYPE_SHORTCUT
GTK_SHORTCUT
GTK_SHORTCUT_CLASS
GTK_IS_SHORTCUT
GTK_IS_SHORTCUT_CLASS
GTK_SHORTCUT_GET_CLASS
<SUBSECTION Private>
gtk_shortcut_get_type
</SECTION>
<SECTION>
<FILE>gtkshortcutcontroller</FILE>
<TITLE>GtkShortcutController</TITLE>
GtkShortcutController
gtk_shortcut_controller_new
gtk_shortcut_controller_new_with_model
GtkShortcutScope
GtkShortcutManager
GtkShortcutManagerInterface
gtk_shortcut_controller_set_mnemonics_modifiers
gtk_shortcut_controller_get_mnemonics_modifiers
gtk_shortcut_controller_set_scope
gtk_shortcut_controller_get_scope
gtk_shortcut_controller_add_shortcut
gtk_shortcut_controller_remove_shortcut
<SUBSECTION Standard>
GTK_TYPE_SHORTCUT_CONTROLLER
GTK_SHORTCUT_CONTROLLER
GTK_SHORTCUT_CONTROLLER_CLASS
GTK_IS_SHORTCUT_CONTROLLER
GTK_IS_SHORTCUT_CONTROLLER_CLASS
GTK_SHORTCUT_CONTROLLER_GET_CLASS
GTK_TYPE_SHORTCUT_MANAGER
GTK_SHORTCUT_MANAGER
GTK_SHORTCUT_MANAGER_CLASS
GTK_IS_SHORTCUT_MANAGER
GTK_IS_SHORTCUT_MANAGER_CLASS
GTK_SHORTCUT_MANAGER_GET_CLASS
<SUBSECTION Private>
gtk_shortcut_controller_get_type
gtk_shortcut_manager_get_type
</SECTION>
<SECTION>
<FILE>gtkeventcontrollerkey</FILE>
<TITLE>GtkEventControllerKey</TITLE>
+5 -2
View File
@@ -2,9 +2,7 @@
#include <gtk/gtkunixprint.h>
gtk_about_dialog_get_type
gtk_accel_group_get_type
gtk_accel_label_get_type
gtk_accel_map_get_type
gtk_accessible_get_type
gtk_actionable_get_type
gtk_action_bar_get_type
@@ -160,7 +158,12 @@ gtk_separator_get_type
gtk_separator_menu_item_get_type
gtk_separator_tool_item_get_type
gtk_settings_get_type
gtk_shortcut_action_get_type
gtk_shortcut_controller_get_type
gtk_shortcut_get_type
gtk_shortcut_label_get_type
gtk_shortcut_manager_get_type
gtk_shortcut_trigger_get_type
gtk_shortcuts_window_get_type
gtk_shortcuts_section_get_type
gtk_shortcuts_group_get_type
+2 -12
View File
@@ -280,27 +280,17 @@ static WidgetInfo *
create_accel_label (void)
{
WidgetInfo *info;
GtkWidget *widget, *button, *box;
GtkAccelGroup *accel_group;
GtkWidget *widget, *box;
widget = gtk_accel_label_new ("Accel Label");
button = gtk_button_new_with_label ("Quit");
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (widget), button);
gtk_widget_hide (button);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (box), widget);
gtk_container_add (GTK_CONTAINER (box), button);
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (widget), button);
accel_group = gtk_accel_group_new();
gtk_accel_label_set_accel (GTK_ACCEL_LABEL (widget), GDK_KEY_Q, GDK_CONTROL_MASK);
info = new_widget_info ("accel-label", box, SMALL);
gtk_widget_add_accelerator (button, "activate", accel_group, GDK_KEY_Q, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
return info;
}
-1
View File
@@ -91,7 +91,6 @@ const GDK_BUTTON5_MASK = 1 << 12;
const GDK_SUPER_MASK = 1 << 26;
const GDK_HYPER_MASK = 1 << 27;
const GDK_META_MASK = 1 << 28;
const GDK_RELEASE_MASK = 1 << 30;
var useDataUrls = window.location.search.includes("datauri");
+1 -1
View File
@@ -738,7 +738,7 @@ gdk_keymap_get_modifier_mask (GdkKeymap *keymap,
* of the key, or %NULL if @keyval is not a valid key. The string
* should not be modified.
*/
gchar *
const gchar *
gdk_keyval_name (guint keyval)
{
return _gdk_keyval_name (keyval);
+1 -1
View File
@@ -133,7 +133,7 @@ GdkModifierType gdk_keymap_get_modifier_mask (GdkKeymap *keymap,
/* Key values
*/
GDK_AVAILABLE_IN_ALL
gchar* gdk_keyval_name (guint keyval) G_GNUC_CONST;
const gchar*gdk_keyval_name (guint keyval) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
guint gdk_keyval_from_name (const gchar *keyval_name);
+4 -6
View File
@@ -200,8 +200,7 @@ typedef enum
* @GDK_HYPER_MASK: the Hyper modifier
* @GDK_META_MASK: the Meta modifier
* @GDK_MODIFIER_RESERVED_29_MASK: A reserved bit flag; do not use in your own code
* @GDK_RELEASE_MASK: not used in GDK itself. GTK uses it to differentiate
* between (keyval, modifiers) pairs from key press and release events.
* @GDK_MODIFIER_RESERVED_30_MASK: A reserved bit flag; do not use in your own code
* @GDK_MODIFIER_MASK: a mask covering all modifier types.
*
* A set of bit-flags to indicate the state of modifier keys and mouse buttons
@@ -262,12 +261,11 @@ typedef enum
GDK_META_MASK = 1 << 28,
GDK_MODIFIER_RESERVED_29_MASK = 1 << 29,
GDK_RELEASE_MASK = 1 << 30,
GDK_MODIFIER_RESERVED_30_MASK = 1 << 30,
/* Combination of GDK_SHIFT_MASK..GDK_BUTTON5_MASK + GDK_SUPER_MASK
+ GDK_HYPER_MASK + GDK_META_MASK + GDK_RELEASE_MASK */
GDK_MODIFIER_MASK = 0x5c001fff
+ GDK_HYPER_MASK + GDK_META_MASK */
GDK_MODIFIER_MASK = 0x1c001fff
} GdkModifierType;
/**
+1 -1
View File
@@ -131,7 +131,7 @@ atk_key_event_from_gdk_event_key (GdkEventKey *key,
event->state = state;
event->keyval = keyval;
event->string = gdk_keyval_name (keyval);
event->string = (char *) gdk_keyval_name (keyval);
event->length = strlen (event->string);
event->keycode = keycode;
event->timestamp = gdk_event_get_time ((GdkEvent *)key);
+6 -46
View File
@@ -446,25 +446,6 @@ gtk_menu_item_accessible_action_get_description (AtkAction *action,
return NULL;
}
static gboolean
find_accel_by_widget (GtkAccelKey *key,
GClosure *closure,
gpointer data)
{
/* We assume that closure->data points to the widget
* pending gtk_widget_get_accel_closures being made public
*/
return data == (gpointer) closure->data;
}
static gboolean
find_accel_by_closure (GtkAccelKey *key,
GClosure *closure,
gpointer data)
{
return data == (gpointer) closure;
}
static GtkWidget *
find_item_label (GtkWidget *item)
{
@@ -520,7 +501,6 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
temp_item = item;
while (TRUE)
{
GdkModifierType mnemonic_modifier = 0;
guint key_val;
gchar *key, *temp_keybinding;
@@ -532,22 +512,13 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
/* parent can be NULL when activating a window from the panel */
return NULL;
if (GTK_IS_MENU_BAR (parent))
{
GtkRoot *root;
root = gtk_widget_get_root (parent);
if (root && GTK_IS_WINDOW (root))
mnemonic_modifier = gtk_window_get_mnemonic_modifier (GTK_WINDOW (root));
}
child = find_item_label (temp_item);
if (GTK_IS_LABEL (child))
{
key_val = gtk_label_get_mnemonic_keyval (GTK_LABEL (child));
if (key_val != GDK_KEY_VoidSymbol)
{
key = gtk_accelerator_name (key_val, mnemonic_modifier);
key = gtk_accelerator_name (key_val, GDK_MOD1_MASK);
if (full_keybinding)
temp_keybinding = g_strconcat (key, ":", full_keybinding, NULL);
else
@@ -603,30 +574,19 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
if (!accelerator)
{
GtkAccelGroup *group;
GtkAccelKey *key = NULL;
guint key = 0;
GdkModifierType modifiers = 0;
group = gtk_menu_get_accel_group (GTK_MENU (parent));
if (group)
key = gtk_accel_group_find (group, find_accel_by_widget, item);
else if (GTK_IS_ACCEL_LABEL (child))
if (GTK_IS_ACCEL_LABEL (child))
{
GtkAccelLabel *accel_label;
GClosure *accel_closure;
accel_label = GTK_ACCEL_LABEL (child);
g_object_get (accel_label, "accel-closure", &accel_closure, NULL);
if (accel_closure)
{
key = gtk_accel_group_find (gtk_accel_group_from_accel_closure (accel_closure),
find_accel_by_closure,
accel_closure);
g_closure_unref (accel_closure);
}
gtk_accel_label_get_accel (accel_label, &key, &modifiers);
}
if (key)
accelerator = gtk_accelerator_name (key->accel_key, key->accel_mods);
accelerator = gtk_accelerator_name (key, modifiers);
}
}
+5 -2
View File
@@ -34,7 +34,6 @@
#include <gtk/gtkaboutdialog.h>
#include <gtk/gtkaccelgroup.h>
#include <gtk/gtkaccellabel.h>
#include <gtk/gtkaccelmap.h>
#include <gtk/gtkaccessible.h>
#include <gtk/gtkactionable.h>
#include <gtk/gtkactionbar.h>
@@ -49,7 +48,6 @@
#include <gtk/gtkassistant.h>
#include <gtk/gtkbin.h>
#include <gtk/gtkbinlayout.h>
#include <gtk/gtkbindings.h>
#include <gtk/gtkborder.h>
#include <gtk/gtkboxlayout.h>
#include <gtk/gtkbox.h>
@@ -201,11 +199,16 @@
#include <gtk/gtkseparatormenuitem.h>
#include <gtk/gtkseparatortoolitem.h>
#include <gtk/gtksettings.h>
#include <gtk/gtkshortcut.h>
#include <gtk/gtkshortcutaction.h>
#include <gtk/gtkshortcutcontroller.h>
#include <gtk/gtkshortcutlabel.h>
#include <gtk/gtkshortcutmanager.h>
#include <gtk/gtkshortcutsgroup.h>
#include <gtk/gtkshortcutssection.h>
#include <gtk/gtkshortcutsshortcut.h>
#include <gtk/gtkshortcutswindow.h>
#include <gtk/gtkshortcuttrigger.h>
#include <gtk/gtkshow.h>
#include <gtk/gtksingleselection.h>
#include <gtk/gtkslicelistmodel.h>
+332 -925
View File
File diff suppressed because it is too large Load Diff
+3 -173
View File
@@ -36,172 +36,17 @@
G_BEGIN_DECLS
/* --- type macros --- */
#define GTK_TYPE_ACCEL_GROUP (gtk_accel_group_get_type ())
#define GTK_ACCEL_GROUP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_ACCEL_GROUP, GtkAccelGroup))
#define GTK_ACCEL_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupClass))
#define GTK_IS_ACCEL_GROUP(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_ACCEL_GROUP))
#define GTK_IS_ACCEL_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ACCEL_GROUP))
#define GTK_ACCEL_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupClass))
/* --- accel flags --- */
/**
* GtkAccelFlags:
* @GTK_ACCEL_VISIBLE: Accelerator is visible
* @GTK_ACCEL_LOCKED: Accelerator not removable
* @GTK_ACCEL_MASK: Mask
*
* Accelerator flags used with gtk_accel_group_connect().
*/
typedef enum
{
GTK_ACCEL_VISIBLE = 1 << 0,
GTK_ACCEL_LOCKED = 1 << 1,
GTK_ACCEL_MASK = 0x07
} GtkAccelFlags;
/* --- typedefs & structures --- */
typedef struct _GtkAccelGroup GtkAccelGroup;
typedef struct _GtkAccelGroupClass GtkAccelGroupClass;
typedef struct _GtkAccelGroupPrivate GtkAccelGroupPrivate;
typedef struct _GtkAccelKey GtkAccelKey;
typedef struct _GtkAccelGroupEntry GtkAccelGroupEntry;
typedef gboolean (*GtkAccelGroupActivate) (GtkAccelGroup *accel_group,
GObject *acceleratable,
guint keyval,
GdkModifierType modifier);
/**
* GtkAccelGroupFindFunc:
* @key:
* @closure:
* @data: (closure):
*/
typedef gboolean (*GtkAccelGroupFindFunc) (GtkAccelKey *key,
GClosure *closure,
gpointer data);
/**
* GtkAccelGroup:
*
* An object representing and maintaining a group of accelerators.
*/
struct _GtkAccelGroup
{
GObject parent;
GtkAccelGroupPrivate *priv;
};
/**
* GtkAccelGroupClass:
* @parent_class: The parent class.
* @accel_changed: Signal emitted when an entry is added to or removed
* from the accel group.
*/
struct _GtkAccelGroupClass
{
GObjectClass parent_class;
/*< public >*/
void (*accel_changed) (GtkAccelGroup *accel_group,
guint keyval,
GdkModifierType modifier,
GClosure *accel_closure);
/*< private >*/
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
};
/**
* GtkAccelKey:
* @accel_key: The accelerator keyval
* @accel_mods:The accelerator modifiers
* @accel_flags: The accelerator flags
*/
struct _GtkAccelKey
{
guint accel_key;
GdkModifierType accel_mods;
guint accel_flags : 16;
};
/* -- Accelerator Groups --- */
GDK_AVAILABLE_IN_ALL
GType gtk_accel_group_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkAccelGroup* gtk_accel_group_new (void);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_group_get_is_locked (GtkAccelGroup *accel_group);
GDK_AVAILABLE_IN_ALL
GdkModifierType
gtk_accel_group_get_modifier_mask (GtkAccelGroup *accel_group);
GDK_AVAILABLE_IN_ALL
void gtk_accel_group_lock (GtkAccelGroup *accel_group);
GDK_AVAILABLE_IN_ALL
void gtk_accel_group_unlock (GtkAccelGroup *accel_group);
GDK_AVAILABLE_IN_ALL
void gtk_accel_group_connect (GtkAccelGroup *accel_group,
guint accel_key,
GdkModifierType accel_mods,
GtkAccelFlags accel_flags,
GClosure *closure);
GDK_AVAILABLE_IN_ALL
void gtk_accel_group_connect_by_path (GtkAccelGroup *accel_group,
const gchar *accel_path,
GClosure *closure);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_group_disconnect (GtkAccelGroup *accel_group,
GClosure *closure);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_group_disconnect_key (GtkAccelGroup *accel_group,
guint accel_key,
GdkModifierType accel_mods);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_group_activate (GtkAccelGroup *accel_group,
GQuark accel_quark,
GObject *acceleratable,
guint accel_key,
GdkModifierType accel_mods);
/* --- GtkActivatable glue --- */
void _gtk_accel_group_attach (GtkAccelGroup *accel_group,
GObject *object);
void _gtk_accel_group_detach (GtkAccelGroup *accel_group,
GObject *object);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_groups_activate (GObject *object,
guint accel_key,
GdkModifierType accel_mods);
GDK_AVAILABLE_IN_ALL
GSList* gtk_accel_groups_from_object (GObject *object);
GDK_AVAILABLE_IN_ALL
GtkAccelKey* gtk_accel_group_find (GtkAccelGroup *accel_group,
GtkAccelGroupFindFunc find_func,
gpointer data);
GDK_AVAILABLE_IN_ALL
GtkAccelGroup* gtk_accel_group_from_accel_closure (GClosure *closure);
/* --- Accelerators--- */
GDK_AVAILABLE_IN_ALL
gboolean gtk_accelerator_valid (guint keyval,
GdkModifierType modifiers) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
void gtk_accelerator_parse (const gchar *accelerator,
gboolean gtk_accelerator_parse (const gchar *accelerator,
guint *accelerator_key,
GdkModifierType *accelerator_mods);
GDK_AVAILABLE_IN_ALL
void gtk_accelerator_parse_with_keycode (const gchar *accelerator,
gboolean gtk_accelerator_parse_with_keycode (const gchar *accelerator,
GdkDisplay *display,
guint *accelerator_key,
guint **accelerator_codes,
GdkModifierType *accelerator_mods);
@@ -227,21 +72,6 @@ GDK_AVAILABLE_IN_ALL
GdkModifierType
gtk_accelerator_get_default_mod_mask (void);
GDK_AVAILABLE_IN_ALL
GtkAccelGroupEntry* gtk_accel_group_query (GtkAccelGroup *accel_group,
guint accel_key,
GdkModifierType accel_mods,
guint *n_entries);
struct _GtkAccelGroupEntry
{
GtkAccelKey key;
GClosure *closure;
GQuark accel_path_quark;
};
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkAccelGroup, g_object_unref)
G_END_DECLS
#endif /* __GTK_ACCEL_GROUP_H__ */
+3 -13
View File
@@ -25,19 +25,9 @@
G_BEGIN_DECLS
struct _GtkAccelGroupPrivate
{
guint lock_count;
GdkModifierType modifier_mask;
GSList *acceleratables;
guint n_accels;
GtkAccelGroupEntry *priv_accels;
};
void _gtk_accel_group_reconnect (GtkAccelGroup *accel_group,
GQuark accel_path_quark);
GSList* _gtk_accel_group_get_accelerables (GtkAccelGroup *accel_group);
void gtk_accelerator_print_label (GString *gstring,
guint accelerator_key,
GdkModifierType accelerator_mods);
G_END_DECLS
#endif /* __GTK_ACCEL_GROUP_PRIVATE_H__ */
+2 -570
View File
@@ -31,7 +31,6 @@
#include "gtklabel.h"
#include "gtkaccellabel.h"
#include "gtkaccellabelprivate.h"
#include "gtkaccelmap.h"
#include "gtkintl.h"
#include "gtkmain.h"
#include "gtkprivate.h"
@@ -79,23 +78,10 @@
* GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
* GtkWidget *menu = gtk_menu_new ();
* GtkWidget *save_item;
* GtkAccelGroup *accel_group;
*
* // Create a GtkAccelGroup and add it to the window.
* accel_group = gtk_accel_group_new ();
* gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
*
* // Create the menu item using the convenience function.
* save_item = gtk_menu_item_new_with_label ("Save");
* gtk_container_add (GTK_CONTAINER (menu), save_item);
*
* // Now add the accelerator to the GtkMenuItem. Note that since we
* // called gtk_menu_item_new_with_label() to create the GtkMenuItem
* // the GtkAccelLabel is automatically set up to display the
* // GtkMenuItem accelerators. We just need to make sure we use
* // GTK_ACCEL_VISIBLE here.
* gtk_widget_add_accelerator (save_item, "activate", accel_group,
* GDK_KEY_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
* ]|
*
* # CSS nodes
@@ -112,8 +98,6 @@
enum {
PROP_0,
PROP_ACCEL_CLOSURE,
PROP_ACCEL_WIDGET,
PROP_LABEL,
PROP_USE_UNDERLINE,
LAST_PROP
@@ -140,10 +124,6 @@ struct _GtkAccelLabelPrivate
GtkWidget *text_label;
GtkWidget *accel_label;
GtkWidget *accel_widget; /* done */
GClosure *accel_closure; /* has set function */
GtkAccelGroup *accel_group; /* set by set_accel_closure() */
guint accel_key; /* manual accel key specification if != 0 */
GdkModifierType accel_mods;
};
@@ -158,7 +138,6 @@ static void gtk_accel_label_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gtk_accel_label_destroy (GtkWidget *widget);
static void gtk_accel_label_finalize (GObject *object);
G_DEFINE_TYPE_WITH_PRIVATE (GtkAccelLabel, gtk_accel_label, GTK_TYPE_WIDGET)
@@ -173,56 +152,8 @@ gtk_accel_label_class_init (GtkAccelLabelClass *class)
gobject_class->set_property = gtk_accel_label_set_property;
gobject_class->get_property = gtk_accel_label_get_property;
widget_class->destroy = gtk_accel_label_destroy;
gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_ACCEL_LABEL);
#ifndef GDK_WINDOWING_QUARTZ
/* This is the text that should appear next to menu accelerators
* that use the shift key. If the text on this key isn't typically
* translated on keyboards used for your language, don't translate
* this.
*/
class->mod_name_shift = g_strdup (C_("keyboard label", "Shift"));
/* This is the text that should appear next to menu accelerators
* that use the control key. If the text on this key isn't typically
* translated on keyboards used for your language, don't translate
* this.
*/
class->mod_name_control = g_strdup (C_("keyboard label", "Ctrl"));
/* This is the text that should appear next to menu accelerators
* that use the alt key. If the text on this key isn't typically
* translated on keyboards used for your language, don't translate
* this.
*/
class->mod_name_alt = g_strdup (C_("keyboard label", "Alt"));
class->mod_separator = g_strdup ("+");
#else /* GDK_WINDOWING_QUARTZ */
/* U+21E7 UPWARDS WHITE ARROW */
class->mod_name_shift = g_strdup ("\xe2\x87\xa7");
/* U+2303 UP ARROWHEAD */
class->mod_name_control = g_strdup ("\xe2\x8c\x83");
/* U+2325 OPTION KEY */
class->mod_name_alt = g_strdup ("\xe2\x8c\xa5");
class->mod_separator = g_strdup ("");
#endif /* GDK_WINDOWING_QUARTZ */
props[PROP_ACCEL_CLOSURE] =
g_param_spec_boxed ("accel-closure",
P_("Accelerator Closure"),
P_("The closure to be monitored for accelerator changes"),
G_TYPE_CLOSURE,
GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
props[PROP_ACCEL_WIDGET] =
g_param_spec_object ("accel-widget",
P_("Accelerator Widget"),
P_("The widget to be monitored for accelerator changes"),
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
props[PROP_LABEL] =
g_param_spec_string ("label",
P_("Label"),
@@ -255,12 +186,6 @@ gtk_accel_label_set_property (GObject *object,
switch (prop_id)
{
case PROP_ACCEL_CLOSURE:
gtk_accel_label_set_accel_closure (accel_label, g_value_get_boxed (value));
break;
case PROP_ACCEL_WIDGET:
gtk_accel_label_set_accel_widget (accel_label, g_value_get_object (value));
break;
case PROP_LABEL:
gtk_accel_label_set_label (accel_label, g_value_get_string (value));
break;
@@ -280,16 +205,9 @@ gtk_accel_label_get_property (GObject *object,
GParamSpec *pspec)
{
GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (object);
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
switch (prop_id)
{
case PROP_ACCEL_CLOSURE:
g_value_set_boxed (value, priv->accel_closure);
break;
case PROP_ACCEL_WIDGET:
g_value_set_object (value, priv->accel_widget);
break;
case PROP_LABEL:
g_value_set_string (value, gtk_accel_label_get_label (accel_label));
break;
@@ -307,10 +225,6 @@ gtk_accel_label_init (GtkAccelLabel *accel_label)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
priv->accel_widget = NULL;
priv->accel_closure = NULL;
priv->accel_group = NULL;
priv->text_label = gtk_label_new ("");
gtk_widget_set_hexpand (priv->text_label, TRUE);
gtk_label_set_xalign (GTK_LABEL (priv->text_label), 0.0f);
@@ -343,17 +257,6 @@ gtk_accel_label_new (const gchar *string)
return GTK_WIDGET (accel_label);
}
static void
gtk_accel_label_destroy (GtkWidget *widget)
{
GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (widget);
gtk_accel_label_set_accel_widget (accel_label, NULL);
gtk_accel_label_set_accel_closure (accel_label, NULL);
GTK_WIDGET_CLASS (gtk_accel_label_parent_class)->destroy (widget);
}
static void
gtk_accel_label_finalize (GObject *object)
{
@@ -366,25 +269,6 @@ gtk_accel_label_finalize (GObject *object)
G_OBJECT_CLASS (gtk_accel_label_parent_class)->finalize (object);
}
/**
* gtk_accel_label_get_accel_widget:
* @accel_label: a #GtkAccelLabel
*
* Fetches the widget monitored by this accelerator label. See
* gtk_accel_label_set_accel_widget().
*
* Returns: (nullable) (transfer none): the object monitored by the accelerator label, or %NULL.
**/
GtkWidget *
gtk_accel_label_get_accel_widget (GtkAccelLabel *accel_label)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
g_return_val_if_fail (GTK_IS_ACCEL_LABEL (accel_label), NULL);
return priv->accel_widget;
}
/**
* gtk_accel_label_get_accel_width:
* @accel_label: a #GtkAccelLabel.
@@ -409,443 +293,12 @@ gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label)
return min;
}
static void
refetch_widget_accel_closure (GtkAccelLabel *accel_label)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
GClosure *closure = NULL;
GList *clist, *list;
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
g_return_if_fail (GTK_IS_WIDGET (priv->accel_widget));
clist = gtk_widget_list_accel_closures (priv->accel_widget);
for (list = clist; list; list = list->next)
{
/* we just take the first closure used */
closure = list->data;
break;
}
g_list_free (clist);
gtk_accel_label_set_accel_closure (accel_label, closure);
}
static void
accel_widget_weak_ref_cb (GtkAccelLabel *accel_label,
GtkWidget *old_accel_widget)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
g_return_if_fail (GTK_IS_WIDGET (priv->accel_widget));
g_signal_handlers_disconnect_by_func (priv->accel_widget,
refetch_widget_accel_closure,
accel_label);
priv->accel_widget = NULL;
g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_WIDGET]);
}
/**
* gtk_accel_label_set_accel_widget:
* @accel_label: a #GtkAccelLabel
* @accel_widget: (nullable): the widget to be monitored, or %NULL
*
* Sets the widget to be monitored by this accelerator label. Passing %NULL for
* @accel_widget will dissociate @accel_label from its current widget, if any.
*/
void
gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label,
GtkWidget *accel_widget)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
if (accel_widget)
g_return_if_fail (GTK_IS_WIDGET (accel_widget));
if (accel_widget != priv->accel_widget)
{
if (priv->accel_widget)
{
gtk_accel_label_set_accel_closure (accel_label, NULL);
g_signal_handlers_disconnect_by_func (priv->accel_widget,
refetch_widget_accel_closure,
accel_label);
g_object_weak_unref (G_OBJECT (priv->accel_widget),
(GWeakNotify) accel_widget_weak_ref_cb, accel_label);
}
priv->accel_widget = accel_widget;
if (priv->accel_widget)
{
g_object_weak_ref (G_OBJECT (priv->accel_widget),
(GWeakNotify) accel_widget_weak_ref_cb, accel_label);
g_signal_connect_object (priv->accel_widget, "accel-closures-changed",
G_CALLBACK (refetch_widget_accel_closure),
accel_label, G_CONNECT_SWAPPED);
refetch_widget_accel_closure (accel_label);
}
g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_WIDGET]);
}
}
static void
gtk_accel_label_reset (GtkAccelLabel *accel_label)
{
gtk_accel_label_refetch (accel_label);
}
static void
check_accel_changed (GtkAccelGroup *accel_group,
guint keyval,
GdkModifierType modifier,
GClosure *accel_closure,
GtkAccelLabel *accel_label)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
if (accel_closure == priv->accel_closure)
gtk_accel_label_reset (accel_label);
}
/**
* gtk_accel_label_set_accel_closure:
* @accel_label: a #GtkAccelLabel
* @accel_closure: (nullable): the closure to monitor for accelerator changes,
* or %NULL
*
* Sets the closure to be monitored by this accelerator label. The closure
* must be connected to an accelerator group; see gtk_accel_group_connect().
* Passing %NULL for @accel_closure will dissociate @accel_label from its
* current closure, if any.
**/
void
gtk_accel_label_set_accel_closure (GtkAccelLabel *accel_label,
GClosure *accel_closure)
{
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
if (accel_closure)
g_return_if_fail (gtk_accel_group_from_accel_closure (accel_closure) != NULL);
if (accel_closure != priv->accel_closure)
{
if (priv->accel_closure)
{
g_signal_handlers_disconnect_by_func (priv->accel_group,
check_accel_changed,
accel_label);
priv->accel_group = NULL;
g_closure_unref (priv->accel_closure);
}
priv->accel_closure = accel_closure;
if (priv->accel_closure)
{
g_closure_ref (priv->accel_closure);
priv->accel_group = gtk_accel_group_from_accel_closure (accel_closure);
g_signal_connect_object (priv->accel_group, "accel-changed", G_CALLBACK (check_accel_changed),
accel_label, 0);
}
gtk_accel_label_reset (accel_label);
g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_CLOSURE]);
}
}
static gboolean
find_accel (GtkAccelKey *key,
GClosure *closure,
gpointer data)
{
return data == (gpointer) closure;
}
/* Underscores in key names are better displayed as spaces
* E.g., Page_Up should be “Page Up”.
*
* Some keynames also have prefixes that are not suitable
* for display, e.g XF86AudioMute, so strip those out, too.
*
* This function is only called on untranslated keynames,
* so no need to be UTF-8 safe.
*/
static void
append_without_underscores (GString *s,
gchar *str)
{
gchar *p;
if (g_str_has_prefix (str, "XF86"))
p = str + 4;
else if (g_str_has_prefix (str, "ISO_"))
p = str + 4;
else
p = str;
for ( ; *p; p++)
{
if (*p == '_')
g_string_append_c (s, ' ');
else
g_string_append_c (s, *p);
}
}
/* On Mac, if the key has symbolic representation (e.g. arrow keys),
* append it to gstring and return TRUE; otherwise return FALSE.
* See http://docs.info.apple.com/article.html?path=Mac/10.5/en/cdb_symbs.html
* for the list of special keys. */
static gboolean
append_keyval_symbol (guint accelerator_key,
GString *gstring)
{
#ifdef GDK_WINDOWING_QUARTZ
switch (accelerator_key)
{
case GDK_KEY_Return:
/* U+21A9 LEFTWARDS ARROW WITH HOOK */
g_string_append (gstring, "\xe2\x86\xa9");
return TRUE;
case GDK_KEY_ISO_Enter:
/* U+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS */
g_string_append (gstring, "\xe2\x8c\xa4");
return TRUE;
case GDK_KEY_Left:
/* U+2190 LEFTWARDS ARROW */
g_string_append (gstring, "\xe2\x86\x90");
return TRUE;
case GDK_KEY_Up:
/* U+2191 UPWARDS ARROW */
g_string_append (gstring, "\xe2\x86\x91");
return TRUE;
case GDK_KEY_Right:
/* U+2192 RIGHTWARDS ARROW */
g_string_append (gstring, "\xe2\x86\x92");
return TRUE;
case GDK_KEY_Down:
/* U+2193 DOWNWARDS ARROW */
g_string_append (gstring, "\xe2\x86\x93");
return TRUE;
case GDK_KEY_Page_Up:
/* U+21DE UPWARDS ARROW WITH DOUBLE STROKE */
g_string_append (gstring, "\xe2\x87\x9e");
return TRUE;
case GDK_KEY_Page_Down:
/* U+21DF DOWNWARDS ARROW WITH DOUBLE STROKE */
g_string_append (gstring, "\xe2\x87\x9f");
return TRUE;
case GDK_KEY_Home:
/* U+2196 NORTH WEST ARROW */
g_string_append (gstring, "\xe2\x86\x96");
return TRUE;
case GDK_KEY_End:
/* U+2198 SOUTH EAST ARROW */
g_string_append (gstring, "\xe2\x86\x98");
return TRUE;
case GDK_KEY_Escape:
/* U+238B BROKEN CIRCLE WITH NORTHWEST ARROW */
g_string_append (gstring, "\xe2\x8e\x8b");
return TRUE;
case GDK_KEY_BackSpace:
/* U+232B ERASE TO THE LEFT */
g_string_append (gstring, "\xe2\x8c\xab");
return TRUE;
case GDK_KEY_Delete:
/* U+2326 ERASE TO THE RIGHT */
g_string_append (gstring, "\xe2\x8c\xa6");
return TRUE;
default:
return FALSE;
}
#else /* !GDK_WINDOWING_QUARTZ */
return FALSE;
#endif
}
gchar *
_gtk_accel_label_class_get_accelerator_label (GtkAccelLabelClass *klass,
guint accelerator_key,
GdkModifierType accelerator_mods)
{
GString *gstring;
gboolean seen_mod = FALSE;
gunichar ch;
gstring = g_string_sized_new (10); /* ~len('backspace') */
if (accelerator_mods & GDK_SHIFT_MASK)
{
g_string_append (gstring, klass->mod_name_shift);
seen_mod = TRUE;
}
if (accelerator_mods & GDK_CONTROL_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
g_string_append (gstring, klass->mod_name_control);
seen_mod = TRUE;
}
if (accelerator_mods & GDK_MOD1_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
g_string_append (gstring, klass->mod_name_alt);
seen_mod = TRUE;
}
if (accelerator_mods & GDK_MOD2_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
g_string_append (gstring, "Mod2");
seen_mod = TRUE;
}
if (accelerator_mods & GDK_MOD3_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
g_string_append (gstring, "Mod3");
seen_mod = TRUE;
}
if (accelerator_mods & GDK_MOD4_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
g_string_append (gstring, "Mod4");
seen_mod = TRUE;
}
if (accelerator_mods & GDK_MOD5_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
g_string_append (gstring, "Mod5");
seen_mod = TRUE;
}
if (accelerator_mods & GDK_SUPER_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
/* This is the text that should appear next to menu accelerators
* that use the super key. If the text on this key isn't typically
* translated on keyboards used for your language, don't translate
* this.
*/
g_string_append (gstring, C_("keyboard label", "Super"));
seen_mod = TRUE;
}
if (accelerator_mods & GDK_HYPER_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
/* This is the text that should appear next to menu accelerators
* that use the hyper key. If the text on this key isn't typically
* translated on keyboards used for your language, don't translate
* this.
*/
g_string_append (gstring, C_("keyboard label", "Hyper"));
seen_mod = TRUE;
}
if (accelerator_mods & GDK_META_MASK)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
#ifndef GDK_WINDOWING_QUARTZ
/* This is the text that should appear next to menu accelerators
* that use the meta key. If the text on this key isn't typically
* translated on keyboards used for your language, don't translate
* this.
*/
g_string_append (gstring, C_("keyboard label", "Meta"));
#else
/* Command key symbol U+2318 PLACE OF INTEREST SIGN */
g_string_append (gstring, "\xe2\x8c\x98");
#endif
seen_mod = TRUE;
}
ch = gdk_keyval_to_unicode (accelerator_key);
if (ch && (ch == ' ' || g_unichar_isgraph (ch)))
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
switch (ch)
{
case ' ':
g_string_append (gstring, C_("keyboard label", "Space"));
break;
case '\\':
g_string_append (gstring, C_("keyboard label", "Backslash"));
break;
default:
g_string_append_unichar (gstring, g_unichar_toupper (ch));
break;
}
}
else if (!append_keyval_symbol (accelerator_key, gstring))
{
gchar *tmp;
tmp = gdk_keyval_name (gdk_keyval_to_lower (accelerator_key));
if (tmp != NULL)
{
if (seen_mod)
g_string_append (gstring, klass->mod_separator);
if (tmp[0] != 0 && tmp[1] == 0)
g_string_append_c (gstring, g_ascii_toupper (tmp[0]));
else
{
const gchar *str;
str = g_dpgettext2 (GETTEXT_PACKAGE, "keyboard label", tmp);
if (str == tmp)
append_without_underscores (gstring, tmp);
else
g_string_append (gstring, str);
}
}
}
return g_string_free (gstring, FALSE);
}
/**
* gtk_accel_label_refetch:
* @accel_label: a #GtkAccelLabel.
@@ -869,7 +322,7 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label)
"gtk-enable-accels", &enable_accels,
NULL);
if (enable_accels && (priv->accel_closure || priv->accel_key))
if (enable_accels && priv->accel_key)
{
gboolean have_accel = FALSE;
guint accel_key;
@@ -883,30 +336,9 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label)
have_accel = TRUE;
}
/* If we don't have a hardcoded value, check the accel group */
if (!have_accel)
{
GtkAccelKey *key;
key = gtk_accel_group_find (priv->accel_group, find_accel, priv->accel_closure);
if (key && key->accel_flags & GTK_ACCEL_VISIBLE)
{
accel_key = key->accel_key;
accel_mods = key->accel_mods;
have_accel = TRUE;
}
}
/* If we found a key using either method, set it */
if (have_accel)
{
GtkAccelLabelClass *klass;
klass = GTK_ACCEL_LABEL_GET_CLASS (accel_label);
accel_string = _gtk_accel_label_class_get_accelerator_label (klass, accel_key, accel_mods);
}
accel_string = gtk_accelerator_get_label (accel_key, accel_mods);
else
/* Otherwise we have a closure with no key. Show "-/-". */
accel_string = g_strdup ("-/-");
-8
View File
@@ -46,16 +46,8 @@ GType gtk_accel_label_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkWidget* gtk_accel_label_new (const gchar *string);
GDK_AVAILABLE_IN_ALL
GtkWidget* gtk_accel_label_get_accel_widget (GtkAccelLabel *accel_label);
GDK_AVAILABLE_IN_ALL
guint gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label);
GDK_AVAILABLE_IN_ALL
void gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label,
GtkWidget *accel_widget);
GDK_AVAILABLE_IN_ALL
void gtk_accel_label_set_accel_closure (GtkAccelLabel *accel_label,
GClosure *accel_closure);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_label_refetch (GtkAccelLabel *accel_label);
GDK_AVAILABLE_IN_ALL
void gtk_accel_label_set_accel (GtkAccelLabel *accel_label,
-1069
View File
File diff suppressed because it is too large Load Diff
-109
View File
@@ -1,109 +0,0 @@
/* GTK - The GIMP Toolkit
* Copyright (C) 1998, 2001 Tim Janik
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GTK_ACCEL_MAP_H__
#define __GTK_ACCEL_MAP_H__
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gtk/gtk.h> can be included directly."
#endif
#include <gtk/gtkaccelgroup.h>
G_BEGIN_DECLS
/* --- global GtkAccelMap object --- */
#define GTK_TYPE_ACCEL_MAP (gtk_accel_map_get_type ())
#define GTK_ACCEL_MAP(accel_map) (G_TYPE_CHECK_INSTANCE_CAST ((accel_map), GTK_TYPE_ACCEL_MAP, GtkAccelMap))
#define GTK_ACCEL_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ACCEL_MAP, GtkAccelMapClass))
#define GTK_IS_ACCEL_MAP(accel_map) (G_TYPE_CHECK_INSTANCE_TYPE ((accel_map), GTK_TYPE_ACCEL_MAP))
#define GTK_IS_ACCEL_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ACCEL_MAP))
#define GTK_ACCEL_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_MAP, GtkAccelMapClass))
typedef struct _GtkAccelMap GtkAccelMap;
typedef struct _GtkAccelMapClass GtkAccelMapClass;
/* --- notifier --- */
/**
* GtkAccelMapForeach:
* @data: User data passed to gtk_accel_map_foreach() or
* gtk_accel_map_foreach_unfiltered()
* @accel_path: Accel path of the current accelerator
* @accel_key: Key of the current accelerator
* @accel_mods: Modifiers of the current accelerator
* @changed: Changed flag of the accelerator (if %TRUE, accelerator has changed
* during runtime and would need to be saved during an accelerator dump)
*/
typedef void (*GtkAccelMapForeach) (gpointer data,
const gchar *accel_path,
guint accel_key,
GdkModifierType accel_mods,
gboolean changed);
/* --- public API --- */
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_add_entry (const gchar *accel_path,
guint accel_key,
GdkModifierType accel_mods);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_map_lookup_entry (const gchar *accel_path,
GtkAccelKey *key);
GDK_AVAILABLE_IN_ALL
gboolean gtk_accel_map_change_entry (const gchar *accel_path,
guint accel_key,
GdkModifierType accel_mods,
gboolean replace);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_load (const gchar *file_name);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_save (const gchar *file_name);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_foreach (gpointer data,
GtkAccelMapForeach foreach_func);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_load_fd (gint fd);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_load_scanner (GScanner *scanner);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_save_fd (gint fd);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_lock_path (const gchar *accel_path);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_unlock_path (const gchar *accel_path);
/* --- filter functions --- */
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_add_filter (const gchar *filter_pattern);
GDK_AVAILABLE_IN_ALL
void gtk_accel_map_foreach_unfiltered (gpointer data,
GtkAccelMapForeach foreach_func);
/* --- notification --- */
GDK_AVAILABLE_IN_ALL
GType gtk_accel_map_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkAccelMap *gtk_accel_map_get (void);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkAccelMap, g_object_unref)
G_END_DECLS
#endif /* __GTK_ACCEL_MAP_H__ */
-39
View File
@@ -1,39 +0,0 @@
/* GTK - The GIMP Toolkit
* Copyright (C) 1998, 2001 Tim Janik
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GTK_ACCEL_MAP_PRIVATE_H__
#define __GTK_ACCEL_MAP_PRIVATE_H__
#include <gtk/gtkaccelmap.h>
G_BEGIN_DECLS
void _gtk_accel_map_init (void);
void _gtk_accel_map_add_group (const gchar *accel_path,
GtkAccelGroup *accel_group);
void _gtk_accel_map_remove_group (const gchar *accel_path,
GtkAccelGroup *accel_group);
gboolean _gtk_accel_path_is_valid (const gchar *accel_path);
gchar * _gtk_accel_path_for_action (const gchar *action_name,
GVariant *parameter);
G_END_DECLS
#endif /* __GTK_ACCEL_MAP_PRIVATE_H__ */
+224 -38
View File
@@ -27,6 +27,10 @@
#include "gtkmarshalers.h"
#include "gtkwidget.h"
#include "gsettings-mapping.h"
#include "gtkshortcut.h"
#include "gtkshortcuttrigger.h"
#include "gtkshortcutaction.h"
#include "gtkconcatmodelprivate.h"
#include <string.h>
@@ -75,6 +79,8 @@ struct _GtkActionMuxer
GtkWidget *widget;
GPtrArray *widget_actions;
gboolean *widget_actions_enabled;
GListModel *shortcuts;
};
G_DEFINE_TYPE_WITH_CODE (GtkActionMuxer, gtk_action_muxer, G_TYPE_OBJECT,
@@ -415,6 +421,9 @@ gtk_action_muxer_primary_accel_changed (GtkActionMuxer *muxer,
g_signal_emit (muxer, accel_signal, 0, action_name, action_and_target);
}
static const char * find_primary_accel (GtkActionMuxer *muxer,
const char *action_and_target);
static void
gtk_action_muxer_parent_primary_accel_changed (GtkActionMuxer *parent,
const gchar *action_name,
@@ -424,7 +433,7 @@ gtk_action_muxer_parent_primary_accel_changed (GtkActionMuxer *parent,
GtkActionMuxer *muxer = user_data;
/* If it's in our table then don't let the parent one filter through */
if (muxer->primary_accels && g_hash_table_lookup (muxer->primary_accels, action_and_target))
if (find_primary_accel (muxer, action_and_target))
return;
gtk_action_muxer_primary_accel_changed (muxer, action_name, action_and_target);
@@ -810,6 +819,8 @@ gtk_action_muxer_finalize (GObject *object)
if (muxer->primary_accels)
g_hash_table_unref (muxer->primary_accels);
g_clear_object (&muxer->shortcuts);
G_OBJECT_CLASS (gtk_action_muxer_parent_class)
->finalize (object);
}
@@ -1095,25 +1106,8 @@ gtk_action_muxer_get_parent (GtkActionMuxer *muxer)
return muxer->parent;
}
static void
emit_changed_accels (GtkActionMuxer *muxer,
GtkActionMuxer *parent)
{
while (parent)
{
if (parent->primary_accels)
{
GHashTableIter iter;
gpointer key;
g_hash_table_iter_init (&iter, parent->primary_accels);
while (g_hash_table_iter_next (&iter, &key, NULL))
gtk_action_muxer_primary_accel_changed (muxer, NULL, key);
}
parent = parent->parent;
}
}
static void emit_changed_accels (GtkActionMuxer *muxer,
GtkActionMuxer *parent);
/*< private >
* gtk_action_muxer_set_parent:
@@ -1184,40 +1178,143 @@ gtk_action_muxer_set_parent (GtkActionMuxer *muxer,
g_object_notify_by_pspec (G_OBJECT (muxer), properties[PROP_PARENT]);
}
typedef struct {
char *action_and_target;
char *primary_accel;
int shortcut_position;
} Accel;
static Accel *
accel_new (const char *action_and_target,
const char *primary_accel,
int shortcut_position)
{
Accel *accel = g_new (Accel, 1);
accel->action_and_target = g_strdup (action_and_target);
accel->primary_accel = g_strdup (primary_accel);
accel->shortcut_position = -1;
return accel;
}
static void
accel_free (gpointer data)
{
Accel *accel = data;
g_free (accel->action_and_target);
g_free (accel->primary_accel);
g_free (accel);
}
static guint
accel_hash (gconstpointer v)
{
const Accel *accel = v;
return g_str_hash (accel->action_and_target);
}
static gboolean
accel_equal (gconstpointer v1,
gconstpointer v2)
{
const Accel *a1 = v1;
const Accel *a2 = v2;
return g_str_equal (a1->action_and_target, a2->action_and_target);
}
static void
emit_changed_accels (GtkActionMuxer *muxer,
GtkActionMuxer *parent)
{
while (parent)
{
if (parent->primary_accels)
{
GHashTableIter iter;
Accel *accel;
g_hash_table_iter_init (&iter, parent->primary_accels);
while (g_hash_table_iter_next (&iter, (gpointer *)&accel, NULL))
gtk_action_muxer_primary_accel_changed (muxer, NULL, accel->action_and_target);
}
parent = parent->parent;
}
}
static void
set_primary_accel (GtkActionMuxer *muxer,
const char *action_and_target,
const char *primary_accel,
int shortcut_position)
{
if (!muxer->primary_accels)
muxer->primary_accels = g_hash_table_new_full (accel_hash, accel_equal, accel_free, NULL);
if (primary_accel)
{
Accel *accel = accel_new (action_and_target, primary_accel, shortcut_position);
g_hash_table_add (muxer->primary_accels, accel);
}
else
{
Accel accel;
accel.action_and_target = (char *)action_and_target;
accel.primary_accel = NULL;
accel.shortcut_position = -1;
g_hash_table_remove (muxer->primary_accels, &accel);
}
gtk_action_muxer_primary_accel_changed (muxer, NULL, action_and_target);
}
void
gtk_action_muxer_set_primary_accel (GtkActionMuxer *muxer,
const gchar *action_and_target,
const gchar *primary_accel)
{
if (!muxer->primary_accels)
muxer->primary_accels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
set_primary_accel (muxer, action_and_target, primary_accel, -1);
}
if (primary_accel)
g_hash_table_insert (muxer->primary_accels, g_strdup (action_and_target), g_strdup (primary_accel));
else
g_hash_table_remove (muxer->primary_accels, action_and_target);
static const char *
find_primary_accel (GtkActionMuxer *muxer,
const char *action_and_target)
{
if (muxer->primary_accels)
{
Accel key;
Accel *value;
gtk_action_muxer_primary_accel_changed (muxer, NULL, action_and_target);
key.action_and_target = (char *)action_and_target;
key.primary_accel = NULL;
key.shortcut_position = -1;
value = g_hash_table_lookup (muxer->primary_accels, &key);
if (value)
return value->primary_accel;
}
return NULL;
}
const gchar *
gtk_action_muxer_get_primary_accel (GtkActionMuxer *muxer,
const gchar *action_and_target)
{
if (muxer->primary_accels)
{
const gchar *primary_accel;
const char *accel;
primary_accel = g_hash_table_lookup (muxer->primary_accels, action_and_target);
accel = find_primary_accel (muxer, action_and_target);
if (accel)
return accel;
if (primary_accel)
return primary_accel;
}
if (muxer->parent)
return gtk_action_muxer_get_primary_accel (muxer->parent, action_and_target);
if (!muxer->parent)
return NULL;
return gtk_action_muxer_get_primary_accel (muxer->parent, action_and_target);
return NULL;
}
gchar *
@@ -1268,3 +1365,92 @@ gtk_normalise_detailed_action_name (const gchar *detailed_action_name)
return action_and_target;
}
static void
gtk_action_muxer_set_primary_accel_from_shortcut (GtkActionMuxer *muxer,
GtkShortcut *shortcut,
int position)
{
GtkShortcutAction *action = gtk_shortcut_get_action (shortcut);
GtkShortcutTrigger *trigger = gtk_shortcut_get_trigger (shortcut);
GVariant *arguments = gtk_shortcut_get_arguments (shortcut);
const char *name;
char *action_and_target;
char *accel;
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION)
return;
name = gtk_action_action_get_name (action);
action_and_target = gtk_print_action_and_target (NULL, name, arguments);
if (find_primary_accel (muxer, action_and_target))
{
g_free (action_and_target);
return;
}
/* FIXME: which display */
accel = gtk_shortcut_trigger_to_label (trigger, gdk_display_get_default ());
set_primary_accel (muxer, action_and_target, accel, position);
g_free (action_and_target);
g_free (accel);
}
static void
shortcut_items_changed (GListModel *model,
guint position,
guint removed,
guint added,
GtkActionMuxer *muxer)
{
if (removed && muxer->primary_accels)
{
GHashTableIter iter;
Accel *accel;
g_hash_table_iter_init (&iter, muxer->primary_accels);
while (g_hash_table_iter_next (&iter, (gpointer*)&accel, NULL))
{
if (accel->shortcut_position >= position &&
accel->shortcut_position < position + removed)
{
gtk_action_muxer_primary_accel_changed (muxer, NULL, accel->action_and_target);
g_hash_table_iter_remove (&iter);
}
else if (accel->shortcut_position >= position + removed)
{
accel->shortcut_position = accel->shortcut_position - removed + added;
}
}
}
if (added)
{
guint i;
for (i = 0; i < added; i++)
{
GtkShortcut *shortcut = g_list_model_get_item (model, position + i);
gtk_action_muxer_set_primary_accel_from_shortcut (muxer,
shortcut,
position + i);
}
}
}
void
gtk_action_muxer_add_shortcuts (GtkActionMuxer *muxer,
GListModel *shortcuts)
{
g_return_if_fail (g_list_model_get_item_type (shortcuts) == GTK_TYPE_SHORTCUT);
if (muxer->shortcuts == NULL)
{
muxer->shortcuts = G_LIST_MODEL (gtk_concat_model_new (GTK_TYPE_SHORTCUT));
g_signal_connect (muxer->shortcuts, "items-changed",
G_CALLBACK (shortcut_items_changed), muxer);
}
gtk_concat_model_append (GTK_CONCAT_MODEL (muxer->shortcuts), shortcuts);
}
+3
View File
@@ -86,6 +86,9 @@ gchar * gtk_print_action_and_target (const g
gchar * gtk_normalise_detailed_action_name (const gchar *detailed_action_name);
void gtk_action_muxer_add_shortcuts (GtkActionMuxer *muxer,
GListModel *shortcuts);
G_END_DECLS
#endif /* __GTK_ACTION_MUXER_H__ */
-1
View File
@@ -37,7 +37,6 @@
#include "gtkmarshalers.h"
#include "gtkmain.h"
#include "gtkrecentmanager.h"
#include "gtkaccelmapprivate.h"
#include "gtkicontheme.h"
#include "gtkbuilder.h"
#include "gtkshortcutswindow.h"
+188 -338
View File
@@ -22,135 +22,28 @@
#include "config.h"
#include "gtkapplicationaccelsprivate.h"
#include "gtkactionmuxerprivate.h"
#include <string.h>
typedef struct
{
guint key;
GdkModifierType modifier;
} AccelKey;
#include "gtkshortcut.h"
#include "gtkshortcutaction.h"
#include "gtkshortcuttrigger.h"
struct _GtkApplicationAccels
{
GObject parent;
GHashTable *action_to_accels;
GHashTable *accel_to_actions;
GListModel *shortcuts;
};
G_DEFINE_TYPE (GtkApplicationAccels, gtk_application_accels, G_TYPE_OBJECT)
static AccelKey *
accel_key_copy (const AccelKey *source)
{
AccelKey *dest;
dest = g_slice_new (AccelKey);
dest->key = source->key;
dest->modifier = source->modifier;
return dest;
}
static void
accel_key_free (gpointer data)
{
AccelKey *key = data;
g_slice_free (AccelKey, key);
}
static guint
accel_key_hash (gconstpointer data)
{
const AccelKey *key = data;
return key->key + (key->modifier << 16);
}
static gboolean
accel_key_equal (gconstpointer a,
gconstpointer b)
{
const AccelKey *ak = a;
const AccelKey *bk = b;
return ak->key == bk->key && ak->modifier == bk->modifier;
}
static void
add_entry (GtkApplicationAccels *accels,
AccelKey *key,
const gchar *action_and_target)
{
const gchar **old;
const gchar **new;
gint n;
old = g_hash_table_lookup (accels->accel_to_actions, key);
if (old != NULL)
for (n = 0; old[n]; n++) /* find the length */
;
else
n = 0;
new = g_new (const gchar *, n + 1 + 1);
memcpy (new, old, n * sizeof (const gchar *));
new[n] = action_and_target;
new[n + 1] = NULL;
g_hash_table_insert (accels->accel_to_actions, accel_key_copy (key), new);
}
static void
remove_entry (GtkApplicationAccels *accels,
AccelKey *key,
const gchar *action_and_target)
{
const gchar **old;
const gchar **new;
gint n, i;
/* if we can't find the entry then something has gone very wrong... */
old = g_hash_table_lookup (accels->accel_to_actions, key);
g_assert (old != NULL);
for (n = 0; old[n]; n++) /* find the length */
;
g_assert_cmpint (n, >, 0);
if (n == 1)
{
/* The simple case of removing the last action for an accel. */
g_assert_cmpstr (old[0], ==, action_and_target);
g_hash_table_remove (accels->accel_to_actions, key);
return;
}
for (i = 0; i < n; i++)
if (g_str_equal (old[i], action_and_target))
break;
/* We must have found it... */
g_assert_cmpint (i, <, n);
new = g_new (const gchar *, n - 1 + 1);
memcpy (new, old, i * sizeof (const gchar *));
memcpy (new + i, old + i + 1, (n - (i + 1)) * sizeof (const gchar *));
new[n - 1] = NULL;
g_hash_table_insert (accels->accel_to_actions, accel_key_copy (key), new);
}
static void
gtk_application_accels_finalize (GObject *object)
{
GtkApplicationAccels *accels = GTK_APPLICATION_ACCELS (object);
g_hash_table_unref (accels->accel_to_actions);
g_hash_table_unref (accels->action_to_accels);
g_list_store_remove_all (G_LIST_STORE (accels->shortcuts));
g_object_unref (accels->shortcuts);
G_OBJECT_CLASS (gtk_application_accels_parent_class)->finalize (object);
}
@@ -166,9 +59,7 @@ gtk_application_accels_class_init (GtkApplicationAccelsClass *klass)
static void
gtk_application_accels_init (GtkApplicationAccels *accels)
{
accels->accel_to_actions = g_hash_table_new_full (accel_key_hash, accel_key_equal,
accel_key_free, g_free);
accels->action_to_accels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
accels->shortcuts = G_LIST_MODEL (g_list_store_new (GTK_TYPE_SHORTCUT));
}
GtkApplicationAccels *
@@ -182,54 +73,99 @@ gtk_application_accels_set_accels_for_action (GtkApplicationAccels *accels,
const gchar *detailed_action_name,
const gchar * const *accelerators)
{
gchar *action_and_target;
AccelKey *keys, *old_keys;
gint i, n;
gchar *action_name;
GVariant *target;
GtkShortcut *shortcut;
GtkShortcutTrigger *trigger = NULL;
GError *error = NULL;
guint i;
action_and_target = gtk_normalise_detailed_action_name (detailed_action_name);
n = accelerators ? g_strv_length ((gchar **) accelerators) : 0;
if (n > 0)
if (!g_action_parse_detailed_name (detailed_action_name, &action_name, &target, &error))
{
keys = g_new0 (AccelKey, n + 1);
g_critical ("Error parsing action name: %s", error->message);
g_error_free (error);
return;
}
for (i = 0; i < n; i++)
/* remove the accelerator if it already exists */
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
{
GtkShortcut *s = g_list_model_get_item (accels->shortcuts, i);
GtkShortcutAction *action = gtk_shortcut_get_action (s);
GVariant *args = gtk_shortcut_get_arguments (s);
g_object_unref (s);
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION ||
!g_str_equal (gtk_action_action_get_name (action), action_name))
continue;
if ((target == NULL && args != NULL) ||
(target != NULL && (args == NULL || !g_variant_equal (target, args))))
continue;
g_list_store_remove (G_LIST_STORE (accels->shortcuts), i);
break;
}
if (accelerators == NULL)
goto out;
for (i = 0; accelerators[i]; i++)
{
GtkShortcutTrigger *new_trigger;
guint key, modifier;
if (!gtk_accelerator_parse (accelerators[i], &key, &modifier))
{
gtk_accelerator_parse (accelerators[i], &keys[i].key, &keys[i].modifier);
if (keys[i].key == 0)
{
g_warning ("Unable to parse accelerator '%s': ignored request to install %d accelerators",
accelerators[i], n);
g_free (action_and_target);
g_free (keys);
return;
}
g_critical ("Unable to parse accelerator '%s': ignored request to install accelerators",
accelerators[i]);
if (trigger)
gtk_shortcut_trigger_unref (trigger);
goto out;;
}
new_trigger = gtk_keyval_trigger_new (key, modifier);
if (trigger)
trigger = gtk_alternative_trigger_new (trigger, new_trigger);
else
trigger = new_trigger;
}
else
keys = NULL;
if (trigger == NULL)
goto out;
old_keys = g_hash_table_lookup (accels->action_to_accels, action_and_target);
if (old_keys)
{
/* We need to remove accel entries from existing keys */
for (i = 0; old_keys[i].key; i++)
remove_entry (accels, &old_keys[i], action_and_target);
}
shortcut = gtk_shortcut_new (trigger, gtk_action_action_new (action_name));
gtk_shortcut_set_arguments (shortcut, target);
g_list_store_append (G_LIST_STORE (accels->shortcuts), shortcut);
g_object_unref (shortcut);
if (keys)
{
g_hash_table_replace (accels->action_to_accels, action_and_target, keys);
out:
g_free (action_name);
if (target)
g_variant_unref (target);
}
for (i = 0; i < n; i++)
add_entry (accels, &keys[i], action_and_target);
}
else
static void
append_accelerators (GPtrArray *accels,
GtkShortcutTrigger *trigger)
{
switch (gtk_shortcut_trigger_get_trigger_type (trigger))
{
g_hash_table_remove (accels->action_to_accels, action_and_target);
g_free (action_and_target);
case GTK_SHORTCUT_TRIGGER_KEYVAL:
g_ptr_array_add (accels,
gtk_accelerator_name (gtk_keyval_trigger_get_keyval (trigger),
gtk_keyval_trigger_get_modifiers (trigger)));
return;
case GTK_SHORTCUT_TRIGGER_ALTERNATIVE:
append_accelerators (accels, gtk_alternative_trigger_get_first (trigger));
append_accelerators (accels, gtk_alternative_trigger_get_second (trigger));
return;
case GTK_SHORTCUT_TRIGGER_MNEMONIC:
case GTK_SHORTCUT_TRIGGER_NEVER:
default:
/* not an accelerator */
return;
}
}
@@ -237,223 +173,137 @@ gchar **
gtk_application_accels_get_accels_for_action (GtkApplicationAccels *accels,
const gchar *detailed_action_name)
{
gchar *action_and_target;
AccelKey *keys;
gchar **result;
gint n, i = 0;
GPtrArray *result;
char *action_name;
GVariant *target;
GError *error = NULL;
guint i;
action_and_target = gtk_normalise_detailed_action_name (detailed_action_name);
result = g_ptr_array_new ();
keys = g_hash_table_lookup (accels->action_to_accels, action_and_target);
if (!keys)
if (!g_action_parse_detailed_name (detailed_action_name, &action_name, &target, &error))
{
g_free (action_and_target);
return g_new0 (gchar *, 0 + 1);
g_critical ("Error parsing action name: %s", error->message);
g_error_free (error);
g_ptr_array_add (result, NULL);
return (gchar **) g_ptr_array_free (result, FALSE);
}
for (n = 0; keys[n].key; n++)
;
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
{
GtkShortcut *shortcut = g_list_model_get_item (accels->shortcuts, i);
GtkShortcutAction *action = gtk_shortcut_get_action (shortcut);
GVariant *args = gtk_shortcut_get_arguments (shortcut);
result = g_new0 (gchar *, n + 1);
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION ||
!g_str_equal (gtk_action_action_get_name (action), action_name))
continue;
for (i = 0; i < n; i++)
result[i] = gtk_accelerator_name (keys[i].key, keys[i].modifier);
if ((target == NULL && args != NULL) ||
(target != NULL && (args == NULL || !g_variant_equal (target, args))))
continue;
g_free (action_and_target);
return result;
append_accelerators (result, gtk_shortcut_get_trigger (shortcut));
break;
}
g_free (action_name);
if (target)
g_variant_unref (target);
g_ptr_array_add (result, NULL);
return (gchar **) g_ptr_array_free (result, FALSE);
}
static gboolean
trigger_matches_accel (GtkShortcutTrigger *trigger,
guint keyval,
GdkModifierType modifiers)
{
switch (gtk_shortcut_trigger_get_trigger_type (trigger))
{
case GTK_SHORTCUT_TRIGGER_KEYVAL:
return gtk_keyval_trigger_get_keyval (trigger) == keyval
&& gtk_keyval_trigger_get_modifiers (trigger) == modifiers;
case GTK_SHORTCUT_TRIGGER_ALTERNATIVE:
return trigger_matches_accel (gtk_alternative_trigger_get_first (trigger), keyval, modifiers)
|| trigger_matches_accel (gtk_alternative_trigger_get_second (trigger), keyval, modifiers);
case GTK_SHORTCUT_TRIGGER_MNEMONIC:
case GTK_SHORTCUT_TRIGGER_NEVER:
default:
return FALSE;
}
}
static char *
get_detailed_name_for_shortcut (GtkShortcut *shortcut)
{
GtkShortcutAction *action = gtk_shortcut_get_action (shortcut);
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION)
return NULL;
return g_action_print_detailed_name (gtk_action_action_get_name (action), gtk_shortcut_get_arguments (shortcut));
}
gchar **
gtk_application_accels_get_actions_for_accel (GtkApplicationAccels *accels,
const gchar *accel)
{
const gchar * const *actions_and_targets;
gchar **detailed_actions;
AccelKey accel_key;
guint i, n;
GPtrArray *result;
guint key, modifiers;
guint i;
gtk_accelerator_parse (accel, &accel_key.key, &accel_key.modifier);
if (accel_key.key == 0)
if (!gtk_accelerator_parse (accel, &key, &modifiers))
{
g_critical ("invalid accelerator string '%s'", accel);
g_return_val_if_fail (accel_key.key != 0, NULL);
return NULL;
}
actions_and_targets = g_hash_table_lookup (accels->accel_to_actions, &accel_key);
n = actions_and_targets ? g_strv_length ((gchar **) actions_and_targets) : 0;
detailed_actions = g_new0 (gchar *, n + 1);
for (i = 0; i < n; i++)
result = g_ptr_array_new ();
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
{
const gchar *action_and_target = actions_and_targets[i];
const gchar *sep;
GVariant *target;
GtkShortcut *shortcut = g_list_model_get_item (accels->shortcuts, i);
char *detailed_name;
sep = strrchr (action_and_target, '|');
target = g_variant_parse (NULL, action_and_target, sep, NULL, NULL);
detailed_actions[i] = g_action_print_detailed_name (sep + 1, target);
if (target)
g_variant_unref (target);
if (!trigger_matches_accel (gtk_shortcut_get_trigger (shortcut), key, modifiers))
continue;
detailed_name = get_detailed_name_for_shortcut (shortcut);
if (detailed_name)
g_ptr_array_add (result, detailed_name);
}
detailed_actions[n] = NULL;
return detailed_actions;
g_ptr_array_add (result, NULL);
return (gchar **) g_ptr_array_free (result, FALSE);
}
gchar **
gtk_application_accels_list_action_descriptions (GtkApplicationAccels *accels)
{
GHashTableIter iter;
gchar **result;
gint n, i = 0;
gpointer key;
GPtrArray *result;
guint i;
n = g_hash_table_size (accels->action_to_accels);
result = g_new (gchar *, n + 1);
g_hash_table_iter_init (&iter, accels->action_to_accels);
while (g_hash_table_iter_next (&iter, &key, NULL))
result = g_ptr_array_new ();
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
{
const gchar *action_and_target = key;
const gchar *sep;
GVariant *target;
GtkShortcut *shortcut = g_list_model_get_item (accels->shortcuts, i);
char *detailed_name;
sep = strrchr (action_and_target, '|');
target = g_variant_parse (NULL, action_and_target, sep, NULL, NULL);
result[i++] = g_action_print_detailed_name (sep + 1, target);
if (target)
g_variant_unref (target);
detailed_name = get_detailed_name_for_shortcut (shortcut);
if (detailed_name)
g_ptr_array_add (result, detailed_name);
}
g_assert_cmpint (i, ==, n);
result[i] = NULL;
return result;
g_ptr_array_add (result, NULL);
return (gchar **) g_ptr_array_free (result, FALSE);
}
void
gtk_application_accels_foreach_key (GtkApplicationAccels *accels,
GtkWindow *window,
GtkWindowKeysForeachFunc callback,
gpointer user_data)
GListModel *
gtk_application_accels_get_shortcuts (GtkApplicationAccels *accels)
{
GHashTableIter iter;
gpointer key;
g_hash_table_iter_init (&iter, accels->accel_to_actions);
while (g_hash_table_iter_next (&iter, &key, NULL))
{
AccelKey *accel_key = key;
(* callback) (window, accel_key->key, accel_key->modifier, FALSE, user_data);
}
}
gboolean
gtk_application_accels_activate (GtkApplicationAccels *accels,
GActionGroup *action_group,
guint key,
GdkModifierType modifier)
{
AccelKey accel_key = { key, modifier };
const gchar **actions;
gint i;
actions = g_hash_table_lookup (accels->accel_to_actions, &accel_key);
if (actions == NULL)
return FALSE;
/* We may have more than one action on a given accel. This could be
* the case if we have different types of windows with different
* actions in each.
*
* Find the first one that will successfully activate and use it.
*/
for (i = 0; actions[i]; i++)
{
const GVariantType *parameter_type;
const gchar *action_name;
const gchar *sep;
gboolean enabled;
GVariant *target;
sep = strrchr (actions[i], '|');
action_name = sep + 1;
if (!g_action_group_query_action (action_group, action_name, &enabled, &parameter_type, NULL, NULL, NULL))
continue;
if (!enabled)
continue;
/* We found an action with the correct name and it's enabled.
* This is the action that we are going to try to invoke.
*
* There is still the possibility that the target value doesn't
* match the expected parameter type. In that case, we will print
* a warning.
*
* Note: we want to hold a ref on the target while we're invoking
* the action to prevent trouble if someone uninstalls the accel
* from the handler. That's not a problem since we're parsing it.
*/
if (actions[i] != sep) /* if it has a target... */
{
GError *error = NULL;
if (parameter_type == NULL)
{
gchar *accel_str = gtk_accelerator_name (key, modifier);
g_warning ("Accelerator '%s' tries to invoke action '%s' with target, but action has no parameter",
accel_str, action_name);
g_free (accel_str);
return TRUE;
}
target = g_variant_parse (NULL, actions[i], sep, NULL, &error);
g_assert_no_error (error);
g_assert (target);
if (!g_variant_is_of_type (target, parameter_type))
{
gchar *accel_str = gtk_accelerator_name (key, modifier);
gchar *typestr = g_variant_type_dup_string (parameter_type);
gchar *targetstr = g_variant_print (target, TRUE);
g_warning ("Accelerator '%s' tries to invoke action '%s' with target '%s',"
" but action expects parameter with type '%s'", accel_str, action_name, targetstr, typestr);
g_variant_unref (target);
g_free (targetstr);
g_free (accel_str);
g_free (typestr);
return TRUE;
}
}
else
{
if (parameter_type != NULL)
{
gchar *accel_str = gtk_accelerator_name (key, modifier);
gchar *typestr = g_variant_type_dup_string (parameter_type);
g_warning ("Accelerator '%s' tries to invoke action '%s' without target,"
" but action expects parameter with type '%s'", accel_str, action_name, typestr);
g_free (accel_str);
g_free (typestr);
return TRUE;
}
target = NULL;
}
g_action_group_activate_action (action_group, action_name, target);
if (target)
g_variant_unref (target);
return TRUE;
}
return FALSE;
return accels->shortcuts;
}
+1 -9
View File
@@ -47,15 +47,7 @@ gchar ** gtk_application_accels_get_actions_for_accel (GtkApplicat
gchar ** gtk_application_accels_list_action_descriptions (GtkApplicationAccels *accels);
void gtk_application_accels_foreach_key (GtkApplicationAccels *accels,
GtkWindow *window,
GtkWindowKeysForeachFunc callback,
gpointer user_data);
gboolean gtk_application_accels_activate (GtkApplicationAccels *accels,
GActionGroup *action_group,
guint key,
GdkModifierType modifier);
GListModel * gtk_application_accels_get_shortcuts (GtkApplicationAccels *accels);
G_END_DECLS
+4 -4
View File
@@ -65,7 +65,6 @@
#include "gtkassistant.h"
#include "gtkbindings.h"
#include "gtkbox.h"
#include "gtkbuildable.h"
#include "gtkbutton.h"
@@ -510,7 +509,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
GtkWindowClass *window_class;
GtkBindingSet *binding_set;
gobject_class = (GObjectClass *) class;
widget_class = (GtkWidgetClass *) class;
@@ -619,8 +617,10 @@ gtk_assistant_class_init (GtkAssistantClass *class)
NULL,
G_TYPE_NONE, 0);
binding_set = gtk_binding_set_by_class (class);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "escape", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"escape",
NULL);
/**
* GtkAssistant:use-header-bar:
-1543
View File
File diff suppressed because it is too large Load Diff
-87
View File
@@ -1,87 +0,0 @@
/* GTK - The GIMP Toolkit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* GtkBindingSet: Keybinding manager for GObjects.
* Copyright (C) 1998 Tim Janik
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#ifndef __GTK_BINDINGS_H__
#define __GTK_BINDINGS_H__
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gtk/gtk.h> can be included directly."
#endif
#include <gdk/gdk.h>
#include <gtk/gtkenums.h>
G_BEGIN_DECLS
typedef struct _GtkBindingSet GtkBindingSet;
GDK_AVAILABLE_IN_ALL
GtkBindingSet *gtk_binding_set_new (const gchar *set_name);
GDK_AVAILABLE_IN_ALL
GtkBindingSet *gtk_binding_set_by_class (gpointer object_class);
GDK_AVAILABLE_IN_ALL
GtkBindingSet *gtk_binding_set_find (const gchar *set_name);
GDK_AVAILABLE_IN_ALL
gboolean gtk_bindings_activate (GObject *object,
guint keyval,
GdkModifierType modifiers);
GDK_AVAILABLE_IN_ALL
gboolean gtk_bindings_activate_event (GObject *object,
GdkEventKey *event);
GDK_AVAILABLE_IN_ALL
gboolean gtk_binding_set_activate (GtkBindingSet *binding_set,
guint keyval,
GdkModifierType modifiers,
GObject *object);
GDK_AVAILABLE_IN_ALL
void gtk_binding_entry_skip (GtkBindingSet *binding_set,
guint keyval,
GdkModifierType modifiers);
GDK_AVAILABLE_IN_ALL
void gtk_binding_entry_add_signal (GtkBindingSet *binding_set,
guint keyval,
GdkModifierType modifiers,
const gchar *signal_name,
guint n_args,
...);
GDK_AVAILABLE_IN_ALL
GTokenType gtk_binding_entry_add_signal_from_string
(GtkBindingSet *binding_set,
const gchar *signal_desc);
GDK_AVAILABLE_IN_ALL
void gtk_binding_entry_remove (GtkBindingSet *binding_set,
guint keyval,
GdkModifierType modifiers);
G_END_DECLS
#endif /* __GTK_BINDINGS_H__ */
+27
View File
@@ -210,8 +210,12 @@
#include "gtkbuilderprivate.h"
#include "gtkdebug.h"
#include "gtkmain.h"
#include "gtkicontheme.h"
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtkshortcutactionprivate.h"
#include "gtkshortcuttrigger.h"
#include "gtktestutils.h"
#include "gtktypebuiltins.h"
#include "gtkicontheme.h"
#include "gtktestutils.h"
@@ -2091,6 +2095,29 @@ gtk_builder_value_from_string_type (GtkBuilder *builder,
ret = FALSE;
}
}
else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_TRIGGER))
{
GtkShortcutTrigger *trigger = gtk_shortcut_trigger_parse_string (string);
if (trigger)
g_value_take_boxed (value, trigger);
else
{
g_set_error (error,
GTK_BUILDER_ERROR,
GTK_BUILDER_ERROR_INVALID_VALUE,
"Could not parse shortcut trigger '%s'",
string);
ret = FALSE;
}
}
else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_ACTION))
{
GtkShortcutAction *action = gtk_shortcut_action_parse_builder (builder, string, error);
/* Works for success and failure (NULL) case */
g_value_take_boxed (value, action);
}
else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
{
gchar **vector = g_strsplit (string, "\n", 0);
+5 -4
View File
@@ -188,16 +188,18 @@ dismiss_current_popup (GtkColorEditor *editor)
}
}
static void
popup_edit (GtkWidget *widget,
GtkColorEditor *editor)
void
gtk_color_editor_popup_menu (GtkWidget *widget)
{
GtkColorEditor *editor;
GtkWidget *popup = NULL;
GtkRoot *root;
GtkWidget *focus;
gint position;
gint s, e;
editor = GTK_COLOR_EDITOR (gtk_widget_get_ancestor (widget, GTK_TYPE_COLOR_EDITOR));
if (widget == editor->priv->sv_plane)
{
popup = editor->priv->sv_popup;
@@ -546,7 +548,6 @@ gtk_color_editor_class_init (GtkColorEditorClass *class)
gtk_widget_class_bind_template_callback (widget_class, entry_text_changed);
gtk_widget_class_bind_template_callback (widget_class, entry_apply);
gtk_widget_class_bind_template_callback (widget_class, entry_focus_changed);
gtk_widget_class_bind_template_callback (widget_class, popup_edit);
gtk_widget_class_bind_template_callback (widget_class, pick_color);
}
+2
View File
@@ -56,6 +56,8 @@ struct _GtkColorEditorClass
GType gtk_color_editor_get_type (void) G_GNUC_CONST;
GtkWidget * gtk_color_editor_new (void);
void gtk_color_editor_popup_menu (GtkWidget *control);
G_END_DECLS
#endif /* __GTK_COLOR_EDITOR_H__ */
+18 -3
View File
@@ -28,6 +28,7 @@
#include "gtksnapshot.h"
#include "gtkprivate.h"
#include "gtkeventcontrollerkey.h"
#include "gtkcoloreditorprivate.h"
struct _GtkColorPlanePrivate
{
@@ -244,11 +245,18 @@ static void
hold_action (GtkGestureLongPress *gesture,
gdouble x,
gdouble y,
GtkColorPlane *plane)
GtkWidget *plane)
{
gboolean handled;
gtk_color_editor_popup_menu (plane);
}
g_signal_emit_by_name (plane, "popup-menu", &handled);
static gboolean
popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data)
{
gtk_color_editor_popup_menu (widget);
return TRUE;
}
static void
@@ -530,6 +538,13 @@ gtk_color_plane_class_init (GtkColorPlaneClass *class)
GTK_TYPE_ADJUSTMENT,
GTK_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
GDK_KEY_F10, GDK_SHIFT_MASK,
popup_menu, NULL);
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
GDK_KEY_Menu, 0,
popup_menu, NULL);
}
GtkWidget *
+19 -4
View File
@@ -29,6 +29,7 @@
#include "gtkprivate.h"
#include "gtkintl.h"
#include "gtksnapshot.h"
#include "gtkcoloreditorprivate.h"
#include <math.h>
@@ -48,7 +49,7 @@ enum
static void hold_action (GtkGestureLongPress *gesture,
gdouble x,
gdouble y,
GtkColorScale *scale);
GtkWidget *scale);
G_DEFINE_TYPE_WITH_PRIVATE (GtkColorScale, gtk_color_scale, GTK_TYPE_SCALE)
@@ -250,11 +251,18 @@ static void
hold_action (GtkGestureLongPress *gesture,
gdouble x,
gdouble y,
GtkColorScale *scale)
GtkWidget *scale)
{
gboolean handled;
gtk_color_editor_popup_menu (scale);
}
g_signal_emit_by_name (scale, "popup-menu", &handled);
static gboolean
popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data)
{
gtk_color_editor_popup_menu (widget);
return TRUE;
}
static void
@@ -280,6 +288,13 @@ gtk_color_scale_class_init (GtkColorScaleClass *class)
g_param_spec_int ("scale-type", P_("Scale type"), P_("Scale type"),
0, 1, 0,
GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
GDK_KEY_F10, GDK_SHIFT_MASK,
popup_menu, NULL);
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
GDK_KEY_Menu, 0,
popup_menu, NULL);
}
void
+11 -4
View File
@@ -422,10 +422,10 @@ gtk_color_swatch_measure (GtkWidget *widget,
*natural = MAX (*natural, min);
}
static gboolean
swatch_popup_menu (GtkWidget *widget)
gtk_color_swatch_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data)
{
do_popup (GTK_COLOR_SWATCH (widget));
return TRUE;
@@ -551,7 +551,6 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
widget_class->drag_begin = swatch_drag_begin;
widget_class->drag_data_get = swatch_drag_data_get;
widget_class->drag_data_received = swatch_drag_data_received;
widget_class->popup_menu = swatch_popup_menu;
widget_class->size_allocate = swatch_size_allocate;
widget_class->state_flags_changed = swatch_state_flags_changed;
@@ -565,6 +564,14 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
g_param_spec_boolean ("has-menu", P_("Has Menu"), P_("Whether the swatch should offer customization"),
TRUE, GTK_PARAM_READWRITE));
/* Context menu */
gtk_widget_class_add_binding (widget_class,
GDK_KEY_F10, GDK_SHIFT_MASK,
gtk_color_swatch_popup_menu, NULL);
gtk_widget_class_add_binding (widget_class,
GDK_KEY_Menu, 0,
gtk_color_swatch_popup_menu, NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_COLOR_SWATCH_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("colorswatch"));
}
+86 -63
View File
@@ -19,12 +19,12 @@
#include "gtkcomboboxprivate.h"
#include "gtkbindings.h"
#include "gtkbox.h"
#include "gtkcellareabox.h"
#include "gtkcelllayout.h"
#include "gtkcellrenderertext.h"
#include "gtkcellview.h"
#include "gtkeventcontrollerkey.h"
#include "gtkeventcontrollerscroll.h"
#include "gtkframe.h"
#include "gtkiconprivate.h"
@@ -36,10 +36,11 @@
#include "gtkmenuprivate.h"
#include "gtkmenushellprivate.h"
#include "gtkprivate.h"
#include "gtkshortcutcontroller.h"
#include "gtktogglebutton.h"
#include "gtktreemenu.h"
#include "gtktypebuiltins.h"
#include "gtkeventcontrollerkey.h"
#include "gtkwidgetprivate.h"
#include "a11y/gtkcomboboxaccessible.h"
@@ -416,7 +417,6 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
GObjectClass *object_class;
GtkContainerClass *container_class;
GtkWidgetClass *widget_class;
GtkBindingSet *binding_set;
container_class = (GtkContainerClass *)klass;
container_class->forall = gtk_combo_box_forall;
@@ -567,57 +567,77 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
G_TYPE_STRING, 1, G_TYPE_STRING);
/* key bindings */
binding_set = gtk_binding_set_by_class (widget_class);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Down, GDK_MOD1_MASK,
"popup",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Down, GDK_MOD1_MASK,
"popup",
NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Down, GDK_MOD1_MASK,
"popup", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Down, GDK_MOD1_MASK,
"popup", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Up, GDK_MOD1_MASK,
"popdown",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Up, GDK_MOD1_MASK,
"popdown",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"popdown",
NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, GDK_MOD1_MASK,
"popdown", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Up, GDK_MOD1_MASK,
"popdown", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
"popdown", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Up, 0,
"move-active",
"(i)", GTK_SCROLL_STEP_UP);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Up, 0,
"move-active",
"(i)", GTK_SCROLL_STEP_UP);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Up, 0,
"move-active",
"(i)", GTK_SCROLL_PAGE_UP);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Page_Up, 0,
"move-active",
"(i)", GTK_SCROLL_PAGE_UP);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Home, 0,
"move-active",
"(i)", GTK_SCROLL_START);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Home, 0,
"move-active",
"(i)", GTK_SCROLL_START);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_UP);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Up, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_UP);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Page_Up, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_UP);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Page_Up, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_UP);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Home, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_START);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Home, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_START);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Down, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_DOWN);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Down, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_DOWN);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Page_Down, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_DOWN);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Page_Down, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_DOWN);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_End, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_END);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_End, 0,
"move-active", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_END);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Down, 0,
"move-active",
"(i)", GTK_SCROLL_STEP_DOWN);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Down, 0,
"move-active",
"(i)", GTK_SCROLL_STEP_DOWN);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Down, 0,
"move-active",
"(i)", GTK_SCROLL_PAGE_DOWN);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Page_Down, 0,
"move-active",
"(i)", GTK_SCROLL_PAGE_DOWN);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_End, 0,
"move-active",
"(i)", GTK_SCROLL_END);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_End, 0,
"move-active",
"(i)", GTK_SCROLL_END);
/* properties */
g_object_class_override_property (object_class,
@@ -835,6 +855,7 @@ gtk_combo_box_init (GtkComboBox *combo_box)
GtkStyleContext *context;
GtkTreeMenu *menu;
GtkEventController *controller;
GList *controllers, *list;
priv->active = -1;
priv->active_row = NULL;
@@ -874,6 +895,19 @@ gtk_combo_box_init (GtkComboBox *combo_box)
G_CALLBACK (gtk_combo_box_scroll_controller_scroll),
combo_box);
gtk_widget_add_controller (GTK_WIDGET (combo_box), controller);
controllers = _gtk_widget_list_controllers (priv->popup_widget, GTK_PHASE_BUBBLE);
for (list = controllers; list; list = list->next)
{
if (GTK_IS_SHORTCUT_CONTROLLER (list->data))
{
g_object_ref (list->data);
gtk_widget_remove_controller (priv->popup_widget, list->data);
gtk_widget_add_controller (priv->popup_widget, list->data);
break;
}
}
g_list_free (controllers);
}
static void
@@ -1850,18 +1884,7 @@ gtk_combo_box_menu_key (GtkEventControllerKey *key,
GdkModifierType modifiers,
GtkComboBox *combo_box)
{
GtkWidget *widget;
GdkEvent *event;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (key));
event = gtk_get_current_event ();
if (!gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)event))
{
gtk_event_controller_key_forward (key, GTK_WIDGET (combo_box));
}
g_object_unref (event);
gtk_event_controller_key_forward (key, GTK_WIDGET (combo_box));
return TRUE;
}
+254
View File
@@ -0,0 +1,254 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
/*
* SECTION:gtkconcatmodel
* @Short_description: concatenation list model
* @Title: GtkConcatModel
* @See_also: #GListModel
*
* #GtkConcatModel is a #GListModel implementation that takes a list of list models
* and presents them as one concatenated list.
*
* Node that all the types of the passed in list models must match the concat model's
* type. If they are not, you must use a common ancestor type for the #GtkConcatModel,
* %G_TYPE_OBJECT being the ultimate option.
**/
#include "config.h"
#include "gtkconcatmodelprivate.h"
struct _GtkConcatModel
{
GObject parent_instance;
GType item_type;
guint n_items;
GList *models;
};
struct _GtkConcatModelClass
{
GObjectClass parent_class;
};
static GType
gtk_concat_model_list_model_get_item_type (GListModel *list)
{
GtkConcatModel *self = GTK_CONCAT_MODEL (list);
return self->item_type;
}
static guint
gtk_concat_model_list_model_get_n_items (GListModel *list)
{
GtkConcatModel *self = GTK_CONCAT_MODEL (list);
return self->n_items;
}
static gpointer
gtk_concat_model_list_model_get_item (GListModel *list,
guint position)
{
GtkConcatModel *self = GTK_CONCAT_MODEL (list);
GList *l;
/* FIXME: Use an RBTree to make this O(log N) */
for (l = self->models; l; l = l->next)
{
guint n = g_list_model_get_n_items (l->data);
if (position < n)
return g_list_model_get_item (l->data, position);
position -= n;
}
return NULL;
}
static void
gtk_concat_model_list_model_init (GListModelInterface *iface)
{
iface->get_item_type = gtk_concat_model_list_model_get_item_type;
iface->get_n_items = gtk_concat_model_list_model_get_n_items;
iface->get_item = gtk_concat_model_list_model_get_item;
}
G_DEFINE_TYPE_WITH_CODE (GtkConcatModel, gtk_concat_model,
G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_concat_model_list_model_init))
static void
gtk_concat_model_items_changed (GListModel *model,
guint position,
guint removed,
guint added,
GtkConcatModel *self)
{
GList *l;
for (l = self->models; l; l = l->next)
{
if (l->data == model)
break;
position += g_list_model_get_n_items (l->data);
}
self->n_items -= removed;
self->n_items += added;
g_list_model_items_changed (G_LIST_MODEL (self),
position,
removed,
added);
}
static void
gtk_concat_model_remove_internal (GtkConcatModel *self,
GListModel *model,
gboolean emit_signals)
{
guint n_items, position;
GList *l;
position = 0;
for (l = self->models; l; l = l->next)
{
if (l->data == model)
break;
position += g_list_model_get_n_items (l->data);
}
g_return_if_fail (l != NULL);
self->models = g_list_delete_link (self->models, l);
n_items = g_list_model_get_n_items (model);
self->n_items -= n_items;
g_signal_handlers_disconnect_by_func (model, gtk_concat_model_items_changed, self);
g_object_unref (model);
if (n_items && emit_signals)
g_list_model_items_changed (G_LIST_MODEL (self),
position,
n_items,
0);
}
static void
gtk_concat_model_dispose (GObject *object)
{
GtkConcatModel *self = GTK_CONCAT_MODEL (object);
/* FIXME: Make this work without signal emissions */
while (self->models)
gtk_concat_model_remove_internal (self, self->models->data, FALSE);
G_OBJECT_CLASS (gtk_concat_model_parent_class)->dispose (object);
}
static void
gtk_concat_model_class_init (GtkConcatModelClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = gtk_concat_model_dispose;
}
static void
gtk_concat_model_init (GtkConcatModel *self)
{
}
GtkConcatModel *
gtk_concat_model_new (GType item_type)
{
GtkConcatModel *self;
g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
self = g_object_new (GTK_TYPE_CONCAT_MODEL, NULL);
self->item_type = item_type;
return self;
}
void
gtk_concat_model_append (GtkConcatModel *self,
GListModel *model)
{
guint n_items;
g_return_if_fail (GTK_IS_CONCAT_MODEL (self));
g_return_if_fail (G_IS_LIST_MODEL (model));
g_return_if_fail (g_type_is_a (g_list_model_get_item_type (model), self->item_type));
g_object_ref (model);
g_signal_connect (model, "items-changed", G_CALLBACK (gtk_concat_model_items_changed), self);
self->models = g_list_append (self->models, model);
n_items = g_list_model_get_n_items (model);
self->n_items += n_items;
if (n_items)
g_list_model_items_changed (G_LIST_MODEL (self),
self->n_items - n_items,
0,
n_items);
}
void
gtk_concat_model_remove (GtkConcatModel *self,
GListModel *model)
{
g_return_if_fail (GTK_IS_CONCAT_MODEL (self));
g_return_if_fail (G_IS_LIST_MODEL (model));
gtk_concat_model_remove_internal (self, model, TRUE);
}
GListModel *
gtk_concat_model_get_model_for_item (GtkConcatModel *self,
guint position)
{
GList *l;
g_return_val_if_fail (GTK_IS_CONCAT_MODEL (self), NULL);
/* FIXME: Use an RBTree to make this O(log N) */
for (l = self->models; l; l = l->next)
{
guint n = g_list_model_get_n_items (l->data);
if (position < n)
return l->data;
position -= n;
}
return NULL;
}
+52
View File
@@ -0,0 +1,52 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_CONCAT_MODEL_H__
#define __GTK_CONCAT_MODEL_H__
#include <gio/gio.h>
G_BEGIN_DECLS
#define GTK_TYPE_CONCAT_MODEL (gtk_concat_model_get_type ())
#define GTK_CONCAT_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_CONCAT_MODEL, GtkConcatModel))
#define GTK_CONCAT_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_CONCAT_MODEL, GtkConcatModelClass))
#define GTK_IS_CONCAT_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_CONCAT_MODEL))
#define GTK_IS_CONCAT_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_CONCAT_MODEL))
#define GTK_CONCAT_MODEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_CONCAT_MODEL, GtkConcatModelClass))
typedef struct _GtkConcatModel GtkConcatModel;
typedef struct _GtkConcatModelClass GtkConcatModelClass;
GType gtk_concat_model_get_type (void) G_GNUC_CONST;
GtkConcatModel * gtk_concat_model_new (GType item_type);
void gtk_concat_model_append (GtkConcatModel *self,
GListModel *model);
void gtk_concat_model_remove (GtkConcatModel *self,
GListModel *model);
GListModel * gtk_concat_model_get_model_for_item (GtkConcatModel *self,
guint position);
G_END_DECLS
#endif /* __GTK_CONCAT_MODEL_H__ */
-1
View File
@@ -32,7 +32,6 @@
#include "gtkstylepropertyprivate.h"
#include "gtkstyleproviderprivate.h"
#include "gtkwidgetpath.h"
#include "gtkbindings.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtkintl.h"
-1
View File
@@ -35,7 +35,6 @@
#include "fallback-c89.c"
/* the actual parsers we have */
#include "gtkbindings.h"
#include "gtkcssarrayvalueprivate.h"
#include "gtkcssbgsizevalueprivate.h"
#include "gtkcssbordervalueprivate.h"
+1 -4
View File
@@ -38,7 +38,6 @@
#include "gtkcontainerprivate.h"
#include "gtkmain.h"
#include "gtkintl.h"
#include "gtkbindings.h"
#include "gtkprivate.h"
#include "gtkbuildable.h"
#include "gtkbuilderprivate.h"
@@ -491,7 +490,6 @@ gtk_dialog_class_init (GtkDialogClass *class)
GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
GtkWindowClass *window_class;
GtkBindingSet *binding_set;
gobject_class = G_OBJECT_CLASS (class);
widget_class = GTK_WIDGET_CLASS (class);
@@ -566,8 +564,7 @@ gtk_dialog_class_init (GtkDialogClass *class)
-1, 1, -1,
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
binding_set = gtk_binding_set_by_class (class);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Escape, 0, "close", NULL);
/* Bind class to template
*/
+47 -12
View File
@@ -31,7 +31,6 @@
#include "gtkentryprivate.h"
#include "gtkadjustment.h"
#include "gtkbindings.h"
#include "gtkbox.h"
#include "gtkbutton.h"
#include "gtkcelleditable.h"
@@ -163,6 +162,7 @@ struct _GtkEntryPrivate
GtkWidget *progress_widget;
GtkWidget *emoji_chooser;
guint activates_default : 1;
guint show_emoji_icon : 1;
guint editing_canceled : 1; /* Only used by GtkCellRendererText */
};
@@ -289,6 +289,10 @@ static GtkEntryBuffer *get_buffer (GtkEntry *entry);
static void set_show_emoji_icon (GtkEntry *entry,
gboolean value);
static void gtk_entry_activate (GtkWidget *widget,
const char *action_name,
GVariant *parameters);
static void gtk_entry_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
@@ -345,7 +349,7 @@ gtk_entry_class_init (GtkEntryClass *class)
widget_class->direction_changed = gtk_entry_direction_changed;
widget_class->grab_focus = gtk_entry_grab_focus;
widget_class->mnemonic_activate = gtk_entry_mnemonic_activate;
quark_entry_completion = g_quark_from_static_string ("gtk-entry-completion-key");
entry_props[PROP_BUFFER] =
@@ -850,7 +854,7 @@ gtk_entry_class_init (GtkEntryClass *class)
signals[ACTIVATE] =
g_signal_new (I_("activate"),
G_OBJECT_CLASS_TYPE (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkEntryClass, activate),
NULL, NULL,
NULL,
@@ -892,6 +896,16 @@ gtk_entry_class_init (GtkEntryClass *class)
G_TYPE_NONE, 1,
GTK_TYPE_ENTRY_ICON_POSITION);
gtk_widget_class_install_action (widget_class, "activate", NULL,
gtk_entry_activate);
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
"activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
"activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
"activate", NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("entry"));
}
@@ -936,7 +950,6 @@ gtk_entry_set_property (GObject *object,
case PROP_VISIBILITY:
case PROP_INVISIBLE_CHAR:
case PROP_INVISIBLE_CHAR_SET:
case PROP_ACTIVATES_DEFAULT:
case PROP_TRUNCATE_MULTILINE:
case PROP_OVERWRITE_MODE:
case PROP_PLACEHOLDER_TEXT:
@@ -949,6 +962,10 @@ gtk_entry_set_property (GObject *object,
g_object_set_property (G_OBJECT (priv->text), pspec->name, value);
break;
case PROP_ACTIVATES_DEFAULT:
gtk_entry_set_activates_default (entry, g_value_get_boolean (value));
break;
case PROP_HAS_FRAME:
gtk_entry_set_has_frame (entry, g_value_get_boolean (value));
break;
@@ -1091,7 +1108,6 @@ gtk_entry_get_property (GObject *object,
case PROP_VISIBILITY:
case PROP_INVISIBLE_CHAR:
case PROP_INVISIBLE_CHAR_SET:
case PROP_ACTIVATES_DEFAULT:
case PROP_SCROLL_OFFSET:
case PROP_TRUNCATE_MULTILINE:
case PROP_OVERWRITE_MODE:
@@ -1104,6 +1120,10 @@ gtk_entry_get_property (GObject *object,
g_object_get_property (G_OBJECT (priv->text), pspec->name, value);
break;
case PROP_ACTIVATES_DEFAULT:
g_value_set_boolean (value, gtk_entry_get_activates_default (entry));
break;
case PROP_HAS_FRAME:
g_value_set_boolean (value, gtk_entry_get_has_frame (entry));
break;
@@ -1232,9 +1252,21 @@ gtk_entry_get_property (GObject *object,
}
static void
activate_cb (GtkText *text, GtkEntry *entry)
gtk_entry_activate (GtkWidget *widget,
const char *action_name,
GVariant *parameters)
{
g_signal_emit (entry, signals[ACTIVATE], 0);
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
if (completion && _gtk_entry_completion_accept (completion))
return;
if (priv->activates_default)
gtk_widget_activate_default (widget);
else
g_signal_emit (entry, signals[ACTIVATE], 0);
}
static void
@@ -1258,7 +1290,6 @@ connect_text_signals (GtkEntry *entry)
{
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
g_signal_connect (priv->text, "activate", G_CALLBACK (activate_cb), entry);
g_signal_connect (priv->text, "notify", G_CALLBACK (notify_cb), entry);
}
@@ -1267,7 +1298,6 @@ disconnect_text_signals (GtkEntry *entry)
{
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
g_signal_handlers_disconnect_by_func (priv->text, activate_cb, entry);
g_signal_handlers_disconnect_by_func (priv->text, notify_cb, entry);
}
@@ -2142,7 +2172,12 @@ gtk_entry_set_activates_default (GtkEntry *entry,
g_return_if_fail (GTK_IS_ENTRY (entry));
gtk_text_set_activates_default (GTK_TEXT (priv->text), setting);
if (priv->activates_default == setting)
return;
priv->activates_default = setting;
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_ACTIVATES_DEFAULT]);
}
/**
@@ -2160,7 +2195,7 @@ gtk_entry_get_activates_default (GtkEntry *entry)
g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE);
return gtk_text_get_activates_default (GTK_TEXT (priv->text));
return priv->activates_default;
}
/**
@@ -3559,7 +3594,7 @@ gtk_entry_set_extra_menu (GtkEntry *entry,
/**
* gtk_entry_get_extra_menu:
* @self: a #GtkText
* @entry: a #GtkText
*
* Gets the menu model set with gtk_entry_set_extra_menu().
*
+1 -27
View File
@@ -78,33 +78,7 @@ struct _GtkEntry
* GtkEntryClass:
* @parent_class: The parent class.
* @activate: Class handler for the #GtkEntry::activate signal. The default
* implementation activates the gtk.activate-default action.
* @move_cursor: Class handler for the #GtkEntry::move-cursor signal. The
* default implementation specifies the standard #GtkEntry cursor movement
* behavior.
* @insert_at_cursor: Class handler for the #GtkEntry::insert-at-cursor signal.
* The default implementation inserts text at the cursor.
* @delete_from_cursor: Class handler for the #GtkEntry::delete-from-cursor
* signal. The default implementation deletes the selection or the specified
* number of characters or words.
* @backspace: Class handler for the #GtkEntry::backspace signal. The default
* implementation deletes the selection or a single character or word.
* @cut_clipboard: Class handler for the #GtkEntry::cut-clipboard signal. The
* default implementation cuts the selection, if one exists.
* @copy_clipboard: Class handler for the #GtkEntry::copy-clipboard signal. The
* default implementation copies the selection, if one exists.
* @paste_clipboard: Class handler for the #GtkEntry::paste-clipboard signal.
* The default implementation pastes at the current cursor position or over
* the current selection if one exists.
* @toggle_overwrite: Class handler for the #GtkEntry::toggle-overwrite signal.
* The default implementation toggles overwrite mode and blinks the cursor.
* @insert_emoji: Class handler for the #GtkEntry::insert-emoji signal.
*
* Class structure for #GtkEntry. All virtual functions have a default
* implementation. Derived classes may set the virtual function pointers for the
* signal handlers to %NULL, but must keep @get_text_area_size and
* @get_frame_size non-%NULL; either use the default implementation, or provide
* a custom one.
* implementation activates the default.activate action.
*/
struct _GtkEntryClass
{
+3 -5
View File
@@ -2294,8 +2294,8 @@ clear_completion_callback (GObject *text,
completion->priv->has_completion = FALSE;
}
static gboolean
accept_completion_callback (GtkEntryCompletion *completion)
gboolean
_gtk_entry_completion_accept (GtkEntryCompletion *completion)
{
if (!completion->priv->inline_completion)
return FALSE;
@@ -2313,7 +2313,7 @@ text_focus_out (GtkEntryCompletion *completion)
if (gtk_widget_get_mapped (completion->priv->popup_window))
return FALSE;
return accept_completion_callback (completion);
return _gtk_entry_completion_accept (completion);
}
static void
@@ -2358,7 +2358,6 @@ connect_completion_signals (GtkEntryCompletion *completion)
completion->priv->insert_text_id =
g_signal_connect (text, "insert-text", G_CALLBACK (completion_insert_text_callback), completion);
g_signal_connect (text, "notify", G_CALLBACK (clear_completion_callback), completion);
g_signal_connect_swapped (text, "activate", G_CALLBACK (accept_completion_callback), completion);
}
static void
@@ -2412,7 +2411,6 @@ disconnect_completion_signals (GtkEntryCompletion *completion)
}
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (completion_insert_text_callback), completion);
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (clear_completion_callback), completion);
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (accept_completion_callback), completion);
}
void
+1
View File
@@ -112,6 +112,7 @@ void _gtk_entry_completion_popdown (GtkEntryCompletion *completion);
void _gtk_entry_completion_connect (GtkEntryCompletion *completion,
GtkEntry *entry);
void _gtk_entry_completion_disconnect (GtkEntryCompletion *completion);
gboolean _gtk_entry_completion_accept (GtkEntryCompletion *completion);
GtkIMContext* _gtk_entry_get_im_context (GtkEntry *entry);
void gtk_entry_enter_text (GtkEntry *entry,
+19
View File
@@ -1016,6 +1016,25 @@ typedef enum
GTK_PAN_DIRECTION_DOWN
} GtkPanDirection;
/**
* GtkShortcutScope:
* @GTK_SHORTCUT_SCOPE_LOCAL: Shortcuts are handled inside
* the widget the controller belongs to.
* @GTK_SHORTCUT_SCOPE_MANAGED: Shortcuts are handled by
* the first ancestor that is a #GtkShortcutManager
* @GTK_SHORTCUT_SCOPE_GLOBAL: Shortcuts are handled by
* the root widget.
*
* Describes where #GtkShortcuts added to a
* #GtkShortcutController get handled.
*/
typedef enum
{
GTK_SHORTCUT_SCOPE_LOCAL,
GTK_SHORTCUT_SCOPE_MANAGED,
GTK_SHORTCUT_SCOPE_GLOBAL
} GtkShortcutScope;
/**
* GtkPopoverConstraint:
* @GTK_POPOVER_CONSTRAINT_NONE: Don't constrain the popover position
-4
View File
@@ -35,7 +35,6 @@
#include "gtkwidgetprivate.h"
#include "gtkeventcontrollerprivate.h"
#include "gtkeventcontrollerkey.h"
#include "gtkbindings.h"
#include "gtkenums.h"
#include "gtkmain.h"
@@ -508,9 +507,6 @@ gtk_event_controller_key_forward (GtkEventControllerKey *controller,
GTK_PHASE_BUBBLE))
return TRUE;
if (gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)controller->current_event))
return TRUE;
return FALSE;
}
+111 -140
View File
@@ -22,7 +22,6 @@
#include "gtkfilechooserwidget.h"
#include "gtkfilechooserwidgetprivate.h"
#include "gtkbindings.h"
#include "gtkbutton.h"
#include "gtkcelllayout.h"
#include "gtkcellrendererpixbuf.h"
@@ -84,6 +83,10 @@
#include "gtkentryprivate.h"
#include "gtkroot.h"
#include "gtkbinlayout.h"
#include "gtkshortcutcontroller.h"
#include "gtkshortcuttrigger.h"
#include "gtkshortcutaction.h"
#include "gtkshortcut.h"
#include <cairo-gobject.h>
@@ -1260,56 +1263,22 @@ places_sidebar_show_error_message_cb (GtkPlacesSidebar *sidebar,
}
static gboolean
key_is_left_or_right (guint keyval,
guint state)
{
guint modifiers;
modifiers = gtk_accelerator_get_default_mod_mask ();
return ((keyval == GDK_KEY_Right
|| keyval == GDK_KEY_KP_Right
|| keyval == GDK_KEY_Left
|| keyval == GDK_KEY_KP_Left)
&& (state & modifiers) == 0);
}
static gboolean
should_trigger_location_entry (GtkFileChooserWidget *impl,
guint keyval,
GdkModifierType state,
const char **string)
trigger_location_entry (GtkWidget *widget,
GVariant *arguments,
gpointer unused)
{
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (widget);
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
GdkModifierType no_text_input_mask;
if (priv->operation_mode == OPERATION_MODE_SEARCH)
return FALSE;
no_text_input_mask =
gtk_widget_get_modifier_mask (GTK_WIDGET (impl), GDK_MODIFIER_INTENT_NO_TEXT_INPUT);
if (state & no_text_input_mask)
if (priv->action != GTK_FILE_CHOOSER_ACTION_OPEN &&
priv->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
return FALSE;
switch (keyval)
{
case GDK_KEY_slash:
case GDK_KEY_KP_Divide:
*string = "/";
return TRUE;
case GDK_KEY_period:
*string = ".";
return TRUE;
case GDK_KEY_asciitilde:
*string = "~";
return TRUE;
default:
return FALSE;
}
location_popup_handler (impl, g_variant_get_string (arguments, NULL));
return TRUE;
}
/* Handles key press events on the file list, so that we can trap Enter to
@@ -1325,21 +1294,6 @@ key_press_cb (GtkEventControllerKey *controller,
{
GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data;
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
const char *string;
if (should_trigger_location_entry (impl, keyval, state, &string) &&
(priv->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER))
{
location_popup_handler (impl, string);
return GDK_EVENT_STOP;
}
if (key_is_left_or_right (keyval, state))
{
if (gtk_widget_child_focus (priv->places_sidebar, GTK_DIR_LEFT))
return GDK_EVENT_STOP;
}
if ((keyval == GDK_KEY_Return
|| keyval == GDK_KEY_ISO_Enter
@@ -1374,28 +1328,15 @@ widget_key_press_cb (GtkEventControllerKey *controller,
GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data;
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
gboolean handled = FALSE;
const char *string;
if (should_trigger_location_entry (impl, keyval, state, &string))
priv->starting_search = TRUE;
if (gtk_event_controller_key_forward (controller, priv->search_entry))
{
if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
{
location_popup_handler (impl, string);
handled = TRUE;
}
}
else
{
priv->starting_search = TRUE;
if (gtk_event_controller_key_forward (controller, priv->search_entry))
{
if (priv->operation_mode != OPERATION_MODE_SEARCH &&
priv->starting_search)
operation_mode_set (impl, OPERATION_MODE_SEARCH);
if (priv->operation_mode != OPERATION_MODE_SEARCH &&
priv->starting_search)
operation_mode_set (impl, OPERATION_MODE_SEARCH);
handled = TRUE;
}
handled = TRUE;
}
return handled;
@@ -2297,9 +2238,11 @@ file_list_show_popover (GtkFileChooserWidget *impl,
/* Callback used for the GtkWidget::popup-menu signal of the file list */
static gboolean
list_popup_menu_cb (GtkWidget *widget,
GtkFileChooserWidget *impl)
list_popup_menu_cb (GtkWidget *widget,
GVariant *args,
gpointer data)
{
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (data);
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
graphene_rect_t bounds;
@@ -8058,18 +8001,20 @@ show_hidden_handler (GtkFileChooserWidget *impl)
}
static void
add_normal_and_shifted_binding (GtkBindingSet *binding_set,
add_normal_and_shifted_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType modifiers,
const gchar *signal_name)
{
gtk_binding_entry_add_signal (binding_set,
keyval, modifiers,
signal_name, 0);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modifiers,
signal_name,
NULL);
gtk_binding_entry_add_signal (binding_set,
keyval, modifiers | GDK_SHIFT_MASK,
signal_name, 0);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modifiers | GDK_SHIFT_MASK,
signal_name,
NULL);
}
static void
@@ -8080,7 +8025,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
};
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
GtkBindingSet *binding_set;
gint i;
gobject_class->finalize = gtk_file_chooser_widget_finalize;
@@ -8362,71 +8306,84 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
NULL,
G_TYPE_NONE, 0);
binding_set = gtk_binding_set_by_class (class);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_l, GDK_CONTROL_MASK,
"location-toggle-popup",
NULL);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_l, GDK_CONTROL_MASK,
"location-toggle-popup",
0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_v, GDK_CONTROL_MASK,
"location-popup-on-paste",
NULL);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_v, GDK_CONTROL_MASK,
"location-popup-on-paste",
0);
add_normal_and_shifted_binding (binding_set,
add_normal_and_shifted_binding (widget_class,
GDK_KEY_Up, GDK_MOD1_MASK,
"up-folder");
add_normal_and_shifted_binding (binding_set,
add_normal_and_shifted_binding (widget_class,
GDK_KEY_KP_Up, GDK_MOD1_MASK,
"up-folder");
add_normal_and_shifted_binding (binding_set,
add_normal_and_shifted_binding (widget_class,
GDK_KEY_Down, GDK_MOD1_MASK,
"down-folder");
add_normal_and_shifted_binding (binding_set,
add_normal_and_shifted_binding (widget_class,
GDK_KEY_KP_Down, GDK_MOD1_MASK,
"down-folder");
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Home, GDK_MOD1_MASK,
"home-folder",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Home, GDK_MOD1_MASK,
"home-folder",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_d, GDK_MOD1_MASK,
"desktop-folder",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_h, GDK_CONTROL_MASK,
"show-hidden",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_s, GDK_MOD1_MASK,
"search-shortcut",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_f, GDK_CONTROL_MASK,
"search-shortcut",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_r, GDK_MOD1_MASK,
"recent-shortcut",
0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_p, GDK_MOD1_MASK,
"places-shortcut",
0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Home, GDK_MOD1_MASK,
"home-folder",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Home, GDK_MOD1_MASK,
"home-folder",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_d, GDK_MOD1_MASK,
"desktop-folder",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_h, GDK_CONTROL_MASK,
"show-hidden",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_s, GDK_MOD1_MASK,
"search-shortcut",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_f, GDK_CONTROL_MASK,
"search-shortcut",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_r, GDK_MOD1_MASK,
"recent-shortcut",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_p, GDK_MOD1_MASK,
"places-shortcut",
NULL);
gtk_widget_class_add_binding (widget_class,
GDK_KEY_slash, 0,
trigger_location_entry,
"s", "/");
gtk_widget_class_add_binding (widget_class,
GDK_KEY_KP_Divide, 0,
trigger_location_entry,
"s", "/");
gtk_widget_class_add_binding (widget_class,
GDK_KEY_period, 0,
trigger_location_entry,
"s", ".");
gtk_widget_class_add_binding (widget_class,
GDK_KEY_asciitilde, 0,
trigger_location_entry,
"s", "~");
for (i = 0; i < 10; i++)
gtk_binding_entry_add_signal (binding_set,
quick_bookmark_keyvals[i], GDK_MOD1_MASK,
"quick-bookmark",
1, G_TYPE_INT, i);
for (i = 0; i < G_N_ELEMENTS (quick_bookmark_keyvals); i++)
gtk_widget_class_add_binding_signal (widget_class,
quick_bookmark_keyvals[i], GDK_MOD1_MASK,
"quick-bookmark",
"(i)", i);
g_object_class_install_property (gobject_class, PROP_SEARCH_MODE,
g_param_spec_boolean ("search-mode",
@@ -8494,7 +8451,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
/* And a *lot* of callbacks to bind ... */
gtk_widget_class_bind_template_callback (widget_class, file_list_drag_drop_cb);
gtk_widget_class_bind_template_callback (widget_class, file_list_drag_data_received_cb);
gtk_widget_class_bind_template_callback (widget_class, list_popup_menu_cb);
gtk_widget_class_bind_template_callback (widget_class, file_list_query_tooltip_cb);
gtk_widget_class_bind_template_callback (widget_class, list_row_activated);
gtk_widget_class_bind_template_callback (widget_class, file_list_drag_begin_cb);
@@ -8534,8 +8490,23 @@ post_process_ui (GtkFileChooserWidget *impl)
GtkCellRenderer *cell;
GList *cells;
GFile *file;
GtkEventController *controller;
GtkShortcutTrigger *trigger;
GtkShortcutAction *action;
GtkShortcut *shortcut;
/* Setup file list treeview */
controller = gtk_shortcut_controller_new ();
trigger = gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_F10, GDK_SHIFT_MASK),
gtk_keyval_trigger_new (GDK_KEY_Menu, 0));
action = gtk_callback_action_new (list_popup_menu_cb, impl, NULL);
shortcut = gtk_shortcut_new (trigger, action);
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
shortcut);
g_object_unref (shortcut);
gtk_widget_add_controller (priv->browse_files_tree_view, controller);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view));
gtk_tree_selection_set_select_function (selection,
list_select_func,
+54 -48
View File
@@ -78,7 +78,6 @@
#include "gtkflowbox.h"
#include "gtkadjustment.h"
#include "gtkbindings.h"
#include "gtkcontainerprivate.h"
#include "gtkcssnodeprivate.h"
#include "gtkgesturedrag.h"
@@ -2987,7 +2986,7 @@ gtk_flow_box_focus (GtkWidget *widget,
}
static void
gtk_flow_box_add_move_binding (GtkBindingSet *binding_set,
gtk_flow_box_add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType modmask,
GtkMovementStep step,
@@ -3005,27 +3004,28 @@ gtk_flow_box_add_move_binding (GtkBindingSet *binding_set,
modify_mod_mask = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
GDK_MODIFIER_INTENT_MODIFY_SELECTION);
}
else
{
extend_mod_mask = GDK_SHIFT_MASK;
modify_mod_mask = GDK_CONTROL_MASK;
}
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_binding_entry_add_signal (binding_set, keyval, modmask | modify_mod_mask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask | modify_mod_mask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask,
"move-cursor",
"(ii)", step, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask | extend_mod_mask,
"move-cursor",
"(ii)", step, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask | modify_mod_mask,
"move-cursor",
"(ii)", step, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask | extend_mod_mask | modify_mod_mask,
"move-cursor",
"(ii)", step, count);
}
static void
@@ -3387,7 +3387,6 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class)
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
GtkBindingSet *binding_set;
object_class->finalize = gtk_flow_box_finalize;
object_class->get_property = gtk_flow_box_get_property;
@@ -3664,50 +3663,57 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class)
widget_class->activate_signal = signals[ACTIVATE_CURSOR_CHILD];
binding_set = gtk_binding_set_by_class (class);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Home, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Home, 0,
GTK_MOVEMENT_BUFFER_ENDS, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
GTK_MOVEMENT_BUFFER_ENDS, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_End, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_End, 0,
GTK_MOVEMENT_BUFFER_ENDS, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_End, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_End, 0,
GTK_MOVEMENT_BUFFER_ENDS, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Up, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Down, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Down, 0,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
GTK_MOVEMENT_PAGES, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
GTK_MOVEMENT_PAGES, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
GTK_MOVEMENT_PAGES, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
GTK_MOVEMENT_PAGES, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Right, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Left, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
"toggle-cursor-child", 0, NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
"toggle-cursor-child", 0, NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, GDK_CONTROL_MASK,
"toggle-cursor-child",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, GDK_CONTROL_MASK,
"toggle-cursor-child",
NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
"select-all", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"unselect-all", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK,
"select-all",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"unselect-all",
NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_FLOW_BOX_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("flowbox"));
+75 -65
View File
@@ -21,7 +21,6 @@
#include "gtkaccessible.h"
#include "gtkadjustmentprivate.h"
#include "gtkbindings.h"
#include "gtkcellareabox.h"
#include "gtkcellareacontext.h"
#include "gtkcelllayout.h"
@@ -235,7 +234,7 @@ static gboolean gtk_icon_view_unselect_all_internal (GtkIco
static void gtk_icon_view_update_rubberband (GtkIconView *icon_view);
static void gtk_icon_view_item_invalidate_size (GtkIconViewItem *item);
static void gtk_icon_view_invalidate_sizes (GtkIconView *icon_view);
static void gtk_icon_view_add_move_binding (GtkBindingSet *binding_set,
static void gtk_icon_view_add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
guint modmask,
GtkMovementStep step,
@@ -338,16 +337,9 @@ G_DEFINE_TYPE_WITH_CODE (GtkIconView, gtk_icon_view, GTK_TYPE_CONTAINER,
static void
gtk_icon_view_class_init (GtkIconViewClass *klass)
{
GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
GtkBindingSet *binding_set;
binding_set = gtk_binding_set_by_class (klass);
gobject_class = (GObjectClass *) klass;
widget_class = (GtkWidgetClass *) klass;
container_class = (GtkContainerClass *) klass;
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
gobject_class->constructed = gtk_icon_view_constructed;
gobject_class->dispose = gtk_icon_view_dispose;
@@ -822,70 +814,88 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
_gtk_marshal_BOOLEAN__ENUM_INTv);
/* Key bindings */
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
"select-all", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"unselect-all", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
"toggle-cursor-item", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
"toggle-cursor-item", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK,
"select-all",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"unselect-all",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, GDK_CONTROL_MASK,
"toggle-cursor-item",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, GDK_CONTROL_MASK,
"toggle-cursor-item",
NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0,
"activate-cursor-item", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0,
"activate-cursor-item", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
"activate-cursor-item", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
"activate-cursor-item", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
"activate-cursor-item", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, 0,
"activate-cursor-item",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, 0,
"activate-cursor-item",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Return, 0,
"activate-cursor-item",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_ISO_Enter, 0,
"activate-cursor-item",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Enter, 0,
"activate-cursor-item",
NULL);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Up, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Down, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Down, 0,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_p, GDK_CONTROL_MASK,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_p, GDK_CONTROL_MASK,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_n, GDK_CONTROL_MASK,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_n, GDK_CONTROL_MASK,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Home, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Home, 0,
GTK_MOVEMENT_BUFFER_ENDS, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
GTK_MOVEMENT_BUFFER_ENDS, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_End, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_End, 0,
GTK_MOVEMENT_BUFFER_ENDS, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_End, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_End, 0,
GTK_MOVEMENT_BUFFER_ENDS, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
GTK_MOVEMENT_PAGES, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
GTK_MOVEMENT_PAGES, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
GTK_MOVEMENT_PAGES, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
GTK_MOVEMENT_PAGES, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Right, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Left, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ICON_VIEW_ACCESSIBLE);
@@ -3410,35 +3420,35 @@ gtk_icon_view_build_items (GtkIconView *icon_view)
}
static void
gtk_icon_view_add_move_binding (GtkBindingSet *binding_set,
gtk_icon_view_add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
guint modmask,
GtkMovementStep step,
gint count)
{
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
I_("move-cursor"), 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask,
I_("move-cursor"),
"(ii)", step, count);
gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK,
"move-cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, GDK_SHIFT_MASK,
"move-cursor",
"(ii)", step, count);
if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
return;
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"move-cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"move-cursor",
"(ii)", step, count);
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK,
"move-cursor", 2,
G_TYPE_ENUM, step,
G_TYPE_INT, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, GDK_CONTROL_MASK,
"move-cursor",
"(ii)", step, count);
}
static gboolean
+6 -10
View File
@@ -39,7 +39,6 @@
#include "gtklabel.h"
#include "gtkbutton.h"
#include "gtkenums.h"
#include "gtkbindings.h"
#include "gtkdialog.h"
#include "gtkrevealer.h"
#include "gtkintl.h"
@@ -323,12 +322,8 @@ gtk_info_bar_close (GtkInfoBar *info_bar)
static void
gtk_info_bar_class_init (GtkInfoBarClass *klass)
{
GtkWidgetClass *widget_class;
GObjectClass *object_class;
GtkBindingSet *binding_set;
widget_class = GTK_WIDGET_CLASS (klass);
object_class = G_OBJECT_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->get_property = gtk_info_bar_get_property;
object_class->set_property = gtk_info_bar_set_property;
@@ -407,9 +402,10 @@ gtk_info_bar_class_init (GtkInfoBarClass *klass)
NULL,
G_TYPE_NONE, 0);
binding_set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"close",
NULL);
/* Bind class to template
*/
+261 -316
View File
@@ -26,7 +26,6 @@
#include "gtklabelprivate.h"
#include "gtkbindings.h"
#include "gtkbuildable.h"
#include "gtkbuilderprivate.h"
#include "gtkcssnodeprivate.h"
@@ -42,11 +41,13 @@
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkmenuitem.h"
#include "gtkmenushellprivate.h"
#include "gtknotebook.h"
#include "gtkpango.h"
#include "gtkprivate.h"
#include "gtkseparatormenuitem.h"
#include "gtkshortcut.h"
#include "gtkshortcutcontroller.h"
#include "gtkshortcuttrigger.h"
#include "gtkshow.h"
#include "gtksnapshot.h"
#include "gtkstylecontextprivate.h"
@@ -265,12 +266,6 @@ struct _GtkLabelClass
{
GtkWidgetClass parent_class;
void (* move_cursor) (GtkLabel *label,
GtkMovementStep step,
gint count,
gboolean extend_selection);
void (* copy_clipboard) (GtkLabel *label);
gboolean (*activate_link) (GtkLabel *label,
const gchar *uri);
};
@@ -279,7 +274,7 @@ struct _GtkLabelPrivate
{
GtkLabelSelectionInfo *select_info;
GtkWidget *mnemonic_widget;
GtkWindow *mnemonic_window;
GtkEventController *mnemonic_controller;
PangoAttrList *attrs;
PangoAttrList *markup_attrs;
@@ -378,10 +373,7 @@ struct _GtkLabelSelectionInfo
};
enum {
MOVE_CURSOR,
COPY_CLIPBOARD,
ACTIVATE_LINK,
ACTIVATE_CURRENT_LINK,
LAST_SIGNAL
};
@@ -417,7 +409,6 @@ static GParamSpec *label_props[NUM_PROPERTIES] = { NULL, };
static guint signals[LAST_SIGNAL] = { 0 };
static GQuark quark_shortcuts_connected;
static GQuark quark_mnemonic_menu;
static GQuark quark_mnemonics_visible_connected;
static GQuark quark_gtk_signal;
static GQuark quark_link;
@@ -482,8 +473,11 @@ static void gtk_label_set_markup_internal (GtkLabel *label,
gboolean with_uline);
static void gtk_label_recalculate (GtkLabel *label);
static void gtk_label_root (GtkWidget *widget);
static void gtk_label_unroot (GtkWidget *widget);
static gboolean gtk_label_popup_menu (GtkWidget *widget);
static void gtk_label_map (GtkWidget *widget);
static void gtk_label_unmap (GtkWidget *widget);
static gboolean gtk_label_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data);
static void gtk_label_do_popup (GtkLabel *label,
double x,
double y);
@@ -504,9 +498,7 @@ static void gtk_label_update_active_link (GtkWidget *widget,
static gboolean gtk_label_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling);
static void gtk_label_setup_mnemonic (GtkLabel *label,
GtkWidget *toplevel,
guint last_key);
static void gtk_label_setup_mnemonic (GtkLabel *label);
static void gtk_label_drag_data_get (GtkWidget *widget,
GdkDrag *drag,
GtkSelectionData *selection_data);
@@ -549,7 +541,6 @@ static gint gtk_label_move_backward_word (GtkLabel *label,
static void gtk_label_clear_links (GtkLabel *label);
static gboolean gtk_label_activate_link (GtkLabel *label,
const gchar *uri);
static void gtk_label_activate_current_link (GtkLabel *label);
static GtkLabelLink *gtk_label_get_current_link (GtkLabel *label);
static void emit_activate_link (GtkLabel *label,
GtkLabelLink *link);
@@ -588,6 +579,9 @@ static void gtk_label_activate_link_open (GtkWidget *label,
static void gtk_label_activate_link_copy (GtkWidget *label,
const char *name,
GVariant *parameter);
static void gtk_label_activate_edit_move_cursor (GtkWidget *label,
const char *name,
GVariant *parameter);
static void gtk_label_nop (GtkWidget *label,
const char *name,
GVariant *parameter);
@@ -613,7 +607,7 @@ G_DEFINE_TYPE_WITH_CODE (GtkLabel, gtk_label, GTK_TYPE_WIDGET,
gtk_label_buildable_interface_init))
static void
add_move_binding (GtkBindingSet *binding_set,
add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
guint modmask,
GtkMovementStep step,
@@ -621,18 +615,16 @@ add_move_binding (GtkBindingSet *binding_set,
{
g_return_if_fail ((modmask & GDK_SHIFT_MASK) == 0);
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
"move-cursor", 3,
G_TYPE_ENUM, step,
G_TYPE_INT, count,
G_TYPE_BOOLEAN, FALSE);
gtk_widget_class_bind_action (widget_class,
keyval, modmask,
"edit.move-cursor", "(iib)",
step, count, FALSE);
/* Selection-extending version */
gtk_binding_entry_add_signal (binding_set, keyval, modmask | GDK_SHIFT_MASK,
"move-cursor", 3,
G_TYPE_ENUM, step,
G_TYPE_INT, count,
G_TYPE_BOOLEAN, TRUE);
gtk_widget_class_bind_action (widget_class,
keyval, modmask | GDK_SHIFT_MASK,
"edit.move-cursor", "(iib)",
step, count, TRUE);
}
static void
@@ -640,7 +632,6 @@ gtk_label_class_init (GtkLabelClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
GtkBindingSet *binding_set;
gobject_class->set_property = gtk_label_set_property;
gobject_class->get_property = gtk_label_get_property;
@@ -655,96 +646,17 @@ gtk_label_class_init (GtkLabelClass *class)
widget_class->realize = gtk_label_realize;
widget_class->unrealize = gtk_label_unrealize;
widget_class->root = gtk_label_root;
widget_class->unroot = gtk_label_unroot;
widget_class->map = gtk_label_map;
widget_class->unmap = gtk_label_unmap;
widget_class->mnemonic_activate = gtk_label_mnemonic_activate;
widget_class->popup_menu = gtk_label_popup_menu;
widget_class->drag_data_get = gtk_label_drag_data_get;
widget_class->grab_focus = gtk_label_grab_focus;
widget_class->focus = gtk_label_focus;
widget_class->get_request_mode = gtk_label_get_request_mode;
widget_class->measure = gtk_label_measure;
class->move_cursor = gtk_label_move_cursor;
class->copy_clipboard = gtk_label_copy_clipboard;
class->activate_link = gtk_label_activate_link;
/**
* GtkLabel::move-cursor:
* @entry: the object which received the signal
* @step: the granularity of the move, as a #GtkMovementStep
* @count: the number of @step units to move
* @extend_selection: %TRUE if the move should extend the selection
*
* The ::move-cursor signal is a
* [keybinding signal][GtkBindingSignal]
* which gets emitted when the user initiates a cursor movement.
* If the cursor is not visible in @entry, this signal causes
* the viewport to be moved instead.
*
* Applications should not connect to it, but may emit it with
* g_signal_emit_by_name() if they need to control the cursor
* programmatically.
*
* The default bindings for this signal come in two variants,
* the variant with the Shift modifier extends the selection,
* the variant without the Shift modifer does not.
* There are too many key combinations to list them all here.
* - Arrow keys move by individual characters/lines
* - Ctrl-arrow key combinations move by words/paragraphs
* - Home/End keys move to the ends of the buffer
*/
signals[MOVE_CURSOR] =
g_signal_new (I_("move-cursor"),
G_OBJECT_CLASS_TYPE (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkLabelClass, move_cursor),
NULL, NULL,
_gtk_marshal_VOID__ENUM_INT_BOOLEAN,
G_TYPE_NONE, 3,
GTK_TYPE_MOVEMENT_STEP,
G_TYPE_INT,
G_TYPE_BOOLEAN);
/**
* GtkLabel::copy-clipboard:
* @label: the object which received the signal
*
* The ::copy-clipboard signal is a
* [keybinding signal][GtkBindingSignal]
* which gets emitted to copy the selection to the clipboard.
*
* The default binding for this signal is Ctrl-c.
*/
signals[COPY_CLIPBOARD] =
g_signal_new (I_("copy-clipboard"),
G_OBJECT_CLASS_TYPE (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkLabelClass, copy_clipboard),
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
/**
* GtkLabel::activate-current-link:
* @label: The label on which the signal was emitted
*
* A [keybinding signal][GtkBindingSignal]
* which gets emitted when the user activates a link in the label.
*
* Applications may also emit the signal with g_signal_emit_by_name()
* if they need to control activation of URIs programmatically.
*
* The default bindings for this signal are all forms of the Enter key.
*/
signals[ACTIVATE_CURRENT_LINK] =
g_signal_new_class_handler (I_("activate-current-link"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_CALLBACK (gtk_label_activate_current_link),
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
/**
* GtkLabel::activate-link:
* @label: The label on which the signal was emitted
@@ -1035,145 +947,191 @@ gtk_label_class_init (GtkLabelClass *class)
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, label_props);
/*
* Key bindings
*/
binding_set = gtk_binding_set_by_class (class);
/* Moving the insertion point */
add_move_binding (binding_set, GDK_KEY_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
add_move_binding (binding_set, GDK_KEY_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
add_move_binding (binding_set, GDK_KEY_f, GDK_CONTROL_MASK,
GTK_MOVEMENT_LOGICAL_POSITIONS, 1);
add_move_binding (binding_set, GDK_KEY_b, GDK_CONTROL_MASK,
GTK_MOVEMENT_LOGICAL_POSITIONS, -1);
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, 1);
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, -1);
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, 1);
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, -1);
/* select all */
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
"move-cursor", 3,
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
G_TYPE_INT, -1,
G_TYPE_BOOLEAN, FALSE);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
"move-cursor", 3,
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
G_TYPE_INT, 1,
G_TYPE_BOOLEAN, TRUE);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
"move-cursor", 3,
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
G_TYPE_INT, -1,
G_TYPE_BOOLEAN, FALSE);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
"move-cursor", 3,
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
G_TYPE_INT, 1,
G_TYPE_BOOLEAN, TRUE);
/* unselect all */
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
"move-cursor", 3,
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
G_TYPE_INT, 0,
G_TYPE_BOOLEAN, FALSE);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_backslash, GDK_CONTROL_MASK,
"move-cursor", 3,
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
G_TYPE_INT, 0,
G_TYPE_BOOLEAN, FALSE);
add_move_binding (binding_set, GDK_KEY_f, GDK_MOD1_MASK,
GTK_MOVEMENT_WORDS, 1);
add_move_binding (binding_set, GDK_KEY_b, GDK_MOD1_MASK,
GTK_MOVEMENT_WORDS, -1);
add_move_binding (binding_set, GDK_KEY_Home, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
add_move_binding (binding_set, GDK_KEY_End, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
add_move_binding (binding_set, GDK_KEY_KP_End, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
add_move_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, -1);
add_move_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, 1);
add_move_binding (binding_set, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, -1);
add_move_binding (binding_set, GDK_KEY_KP_End, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, 1);
/* copy */
gtk_binding_entry_add_signal (binding_set, GDK_KEY_c, GDK_CONTROL_MASK,
"copy-clipboard", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
"activate-current-link", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
"activate-current-link", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
"activate-current-link", 0);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LABEL_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("label"));
quark_shortcuts_connected = g_quark_from_static_string ("gtk-label-shortcuts-connected");
quark_mnemonic_menu = g_quark_from_static_string ("gtk-mnemonic-menu");
quark_mnemonics_visible_connected = g_quark_from_static_string ("gtk-label-mnemonics-visible-connected");
quark_gtk_signal = g_quark_from_static_string ("gtk-signal");
quark_link = g_quark_from_static_string ("link");
/* Actions */
gtk_widget_class_install_action (widget_class, "clipboard.cut", NULL,
gtk_label_nop);
/**
* GtkLabel|clipboard.copy:
*
* The clipboard.copy action puts the current selection
* on the clipboard. It is enabled when the selection is nonempty.
*
* The default binding for this action is Ctrl-c.
*/
gtk_widget_class_install_action (widget_class, "clipboard.copy", NULL,
gtk_label_activate_clipboard_copy);
gtk_widget_class_install_action (widget_class, "clipboard.paste", NULL,
gtk_label_nop);
gtk_widget_class_install_action (widget_class, "selection.delete", NULL,
gtk_label_nop);
/**
* GtkLabel|selection.select-all:
*
* The selection.select-all action selects all the text.
* It is enabled when the GtkLabel contains text.
*
* The default binding for this action is Ctrl-a.
*/
gtk_widget_class_install_action (widget_class, "selection.select-all", NULL,
gtk_label_activate_selection_select_all);
/**
* GtkLabel|link.open:
*
* The link.open action calls gtk_show_uri() on the currently
* focused link. It is enabled when a link is focused and there
* is no selection.
*/
gtk_widget_class_install_action (widget_class, "link.open", NULL,
gtk_label_activate_link_open);
/**
* GtkLabel|link.copy:
*
* The link.copy action copies the currently focused link to
* the clipboard. It is enabled when a link is focused and
* there is no selection.
*/
gtk_widget_class_install_action (widget_class, "link.copy", NULL,
gtk_label_activate_link_copy);
/**
* GtkLabel|edit.move-cursor:
* @granularity: a #GtkMovementStep defining the granularity of movement
* @count: the number of steps to move the cursor
* @extend: %TRUE to extend the selection
*
* The edit.move-cursor action changes the position of the
* text caret in the text, and may extend the selection while
* doing so.
*
* The default bindings for this action include
* the Left and Right arrow keys, Home and End.
*
* All bindings can be used with the Shift modifier
* to extend the selection.
*/
gtk_widget_class_install_action (widget_class, "edit.move-cursor", "(iib)",
gtk_label_activate_edit_move_cursor);
/*
* Key bindings
*/
/* Moving the insertion point */
add_move_binding (widget_class, GDK_KEY_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
add_move_binding (widget_class, GDK_KEY_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
add_move_binding (widget_class, GDK_KEY_f, GDK_CONTROL_MASK,
GTK_MOVEMENT_LOGICAL_POSITIONS, 1);
add_move_binding (widget_class, GDK_KEY_b, GDK_CONTROL_MASK,
GTK_MOVEMENT_LOGICAL_POSITIONS, -1);
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, 1);
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, -1);
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, 1);
add_move_binding (widget_class, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
GTK_MOVEMENT_WORDS, -1);
/* select all */
gtk_widget_class_bind_action (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK,
"selection.select-all", NULL);
gtk_widget_class_bind_action (widget_class,
GDK_KEY_slash, GDK_CONTROL_MASK,
"selection.select-all", NULL);
/* unselect all */
gtk_widget_class_bind_action (widget_class,
GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
"edit.move-cursor", "(iib)",
GTK_MOVEMENT_PARAGRAPH_ENDS, 0, FALSE);
gtk_widget_class_bind_action (widget_class,
GDK_KEY_backslash, GDK_CONTROL_MASK,
"edit.move-cursor", "(iib)",
GTK_MOVEMENT_PARAGRAPH_ENDS, 0, FALSE);
add_move_binding (widget_class, GDK_KEY_f, GDK_MOD1_MASK,
GTK_MOVEMENT_WORDS, 1);
add_move_binding (widget_class, GDK_KEY_b, GDK_MOD1_MASK,
GTK_MOVEMENT_WORDS, -1);
add_move_binding (widget_class, GDK_KEY_Home, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
add_move_binding (widget_class, GDK_KEY_End, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
add_move_binding (widget_class, GDK_KEY_KP_End, 0,
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
add_move_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, -1);
add_move_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, 1);
add_move_binding (widget_class, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, -1);
add_move_binding (widget_class, GDK_KEY_KP_End, GDK_CONTROL_MASK,
GTK_MOVEMENT_BUFFER_ENDS, 1);
/* copy */
gtk_widget_class_bind_action (widget_class,
GDK_KEY_c, GDK_CONTROL_MASK,
"clipboard.copy", NULL);
gtk_widget_class_bind_action (widget_class,
GDK_KEY_Return, 0,
"link.open", NULL);
gtk_widget_class_bind_action (widget_class,
GDK_KEY_ISO_Enter, 0,
"link.open", NULL);
gtk_widget_class_bind_action (widget_class,
GDK_KEY_KP_Enter, 0,
"link.open", NULL);
/* Context menu */
gtk_widget_class_add_binding (widget_class,
GDK_KEY_F10, GDK_SHIFT_MASK,
gtk_label_popup_menu, NULL);
gtk_widget_class_add_binding (widget_class,
GDK_KEY_Menu, 0,
gtk_label_popup_menu, NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LABEL_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("label"));
quark_shortcuts_connected = g_quark_from_static_string ("gtk-label-shortcuts-connected");
quark_mnemonics_visible_connected = g_quark_from_static_string ("gtk-label-mnemonics-visible-connected");
quark_gtk_signal = g_quark_from_static_string ("gtk-signal");
quark_link = g_quark_from_static_string ("link");
}
static void
@@ -1358,7 +1316,6 @@ gtk_label_init (GtkLabel *label)
priv->attrs = NULL;
priv->mnemonic_widget = NULL;
priv->mnemonic_window = NULL;
priv->mnemonics_visible = FALSE;
}
@@ -1798,65 +1755,44 @@ gtk_label_mnemonic_activate (GtkWidget *widget,
}
static void
gtk_label_setup_mnemonic (GtkLabel *label,
GtkWidget *toplevel,
guint last_key)
gtk_label_setup_mnemonic (GtkLabel *label)
{
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
GtkWidget *widget = GTK_WIDGET (label);
GtkWidget *mnemonic_menu;
GtkShortcut *shortcut;
mnemonic_menu = g_object_get_qdata (G_OBJECT (label), quark_mnemonic_menu);
if (last_key != GDK_KEY_VoidSymbol)
if (!gtk_widget_get_mapped (GTK_WIDGET (label)) ||
priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
{
if (priv->mnemonic_window)
{
gtk_window_remove_mnemonic (priv->mnemonic_window,
last_key,
widget);
priv->mnemonic_window = NULL;
}
if (mnemonic_menu)
{
_gtk_menu_shell_remove_mnemonic (GTK_MENU_SHELL (mnemonic_menu),
last_key,
widget);
mnemonic_menu = NULL;
}
if (priv->mnemonic_controller)
{
gtk_widget_remove_controller (widget, priv->mnemonic_controller);
priv->mnemonic_controller = NULL;
}
return;
}
if (priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
goto done;
if (priv->mnemonic_controller == NULL)
{
priv->mnemonic_controller = gtk_shortcut_controller_new ();
gtk_event_controller_set_name (priv->mnemonic_controller, "mnemonic");
gtk_event_controller_set_propagation_phase (priv->mnemonic_controller, GTK_PHASE_CAPTURE);
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), GTK_SHORTCUT_SCOPE_MANAGED);
shortcut = gtk_shortcut_new (gtk_mnemonic_trigger_new (priv->mnemonic_keyval),
gtk_mnemonic_action_new ());
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), shortcut);
gtk_widget_add_controller (GTK_WIDGET (label), priv->mnemonic_controller);
g_object_unref (shortcut);
}
else
{
shortcut = g_list_model_get_item (G_LIST_MODEL (priv->mnemonic_controller), 0);
gtk_shortcut_set_trigger (shortcut, gtk_mnemonic_trigger_new (priv->mnemonic_keyval));
g_object_unref (shortcut);
}
connect_mnemonics_visible_notify (GTK_LABEL (widget));
if (GTK_IS_WINDOW (toplevel))
{
GtkWidget *menu_shell;
menu_shell = gtk_widget_get_ancestor (widget,
GTK_TYPE_MENU_SHELL);
if (menu_shell)
{
_gtk_menu_shell_add_mnemonic (GTK_MENU_SHELL (menu_shell),
priv->mnemonic_keyval,
widget);
mnemonic_menu = menu_shell;
}
if (!GTK_IS_MENU (menu_shell))
{
gtk_window_add_mnemonic (GTK_WINDOW (toplevel),
priv->mnemonic_keyval,
widget);
priv->mnemonic_window = GTK_WINDOW (toplevel);
}
}
done:
g_object_set_qdata (G_OBJECT (label), quark_mnemonic_menu, mnemonic_menu);
}
static void
@@ -1899,16 +1835,13 @@ static void
gtk_label_root (GtkWidget *widget)
{
GtkLabel *label = GTK_LABEL (widget);
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
GtkSettings *settings;
gboolean shortcuts_connected;
GTK_WIDGET_CLASS (gtk_label_parent_class)->root (widget);
gtk_label_setup_mnemonic (label, GTK_WIDGET (gtk_widget_get_root (widget)), priv->mnemonic_keyval);
/* The PangoContext is replaced when the display changes, so clear the layouts */
gtk_label_clear_layout (GTK_LABEL (widget));
gtk_label_clear_layout (label);
settings = gtk_widget_get_settings (widget);
@@ -1925,18 +1858,27 @@ gtk_label_root (GtkWidget *widget)
GINT_TO_POINTER (TRUE));
}
label_shortcut_setting_apply (GTK_LABEL (widget));
label_shortcut_setting_apply (label);
}
static void
gtk_label_unroot (GtkWidget *widget)
gtk_label_map (GtkWidget *widget)
{
GtkLabel *label = GTK_LABEL (widget);
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
gtk_label_setup_mnemonic (label, NULL, priv->mnemonic_keyval);
GTK_WIDGET_CLASS (gtk_label_parent_class)->map (widget);
GTK_WIDGET_CLASS (gtk_label_parent_class)->unroot (widget);
gtk_label_setup_mnemonic (label);
}
static void
gtk_label_unmap (GtkWidget *widget)
{
GtkLabel *label = GTK_LABEL (widget);
GTK_WIDGET_CLASS (gtk_label_parent_class)->unmap (widget);
gtk_label_setup_mnemonic (label);
}
void
@@ -2182,7 +2124,7 @@ gtk_label_recalculate (GtkLabel *label)
if (keyval != priv->mnemonic_keyval)
{
gtk_label_setup_mnemonic (label, GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (label))), keyval);
gtk_label_setup_mnemonic (label);
g_object_notify_by_pspec (G_OBJECT (label), label_props[PROP_MNEMONIC_KEYVAL]);
}
@@ -6037,7 +5979,7 @@ gtk_label_activate_clipboard_copy (GtkWidget *widget,
const char *name,
GVariant *parameter)
{
g_signal_emit_by_name (widget, "copy-clipboard");
gtk_label_copy_clipboard (GTK_LABEL (widget));
}
static void
@@ -6048,6 +5990,23 @@ gtk_label_activate_selection_select_all (GtkWidget *widget,
gtk_label_select_all (GTK_LABEL (widget));
}
static void
gtk_label_activate_edit_move_cursor (GtkWidget *widget,
const char *name,
GVariant *parameter)
{
GtkMovementStep step;
int count;
gboolean extend;
g_variant_get (parameter, "(iib)", &step, &count, &extend);
step = CLAMP (step, GTK_MOVEMENT_LOGICAL_POSITIONS,
GTK_MOVEMENT_HORIZONTAL_PAGES);
gtk_label_move_cursor (GTK_LABEL (widget), step, count, extend);
}
static void
gtk_label_nop (GtkWidget *widget,
const char *name,
@@ -6163,11 +6122,11 @@ gtk_label_do_popup (GtkLabel *label,
}
static gboolean
gtk_label_popup_menu (GtkWidget *widget)
gtk_label_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data)
{
GtkLabel *label = GTK_LABEL (widget);
gtk_label_do_popup (label, -1, -1);
gtk_label_do_popup (GTK_LABEL (widget), -1, -1);
return TRUE;
}
@@ -6232,20 +6191,6 @@ emit_activate_link (GtkLabel *label,
}
}
static void
gtk_label_activate_current_link (GtkLabel *label)
{
GtkLabelLink *link;
GtkWidget *widget = GTK_WIDGET (label);
link = gtk_label_get_focus_link (label);
if (link)
emit_activate_link (label, link);
else
gtk_widget_activate_default (widget);
}
static GtkLabelLink *
gtk_label_get_current_link (GtkLabel *label)
{
+17 -7
View File
@@ -123,7 +123,9 @@ static void gtk_link_button_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec);
static void gtk_link_button_clicked (GtkButton *button);
static gboolean gtk_link_button_popup_menu (GtkWidget *widget);
static gboolean gtk_link_button_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data);
static void gtk_link_button_drag_data_get_cb (GtkWidget *widget,
GdkDrag *drag,
GtkSelectionData *selection,
@@ -173,8 +175,6 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass)
gobject_class->get_property = gtk_link_button_get_property;
gobject_class->finalize = gtk_link_button_finalize;
widget_class->popup_menu = gtk_link_button_popup_menu;
button_class->clicked = gtk_link_button_clicked;
klass->activate_link = gtk_link_button_activate_link;
@@ -229,11 +229,19 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass)
_gtk_marshal_BOOLEAN__VOID,
G_TYPE_BOOLEAN, 0);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LINK_BUTTON_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("button"));
gtk_widget_class_install_action (widget_class, "clipboard.copy", NULL,
gtk_link_button_activate_clipboard_copy);
/* Context menu */
gtk_widget_class_add_binding (widget_class,
GDK_KEY_F10, GDK_SHIFT_MASK,
gtk_link_button_popup_menu, NULL);
gtk_widget_class_add_binding (widget_class,
GDK_KEY_Menu, 0,
gtk_link_button_popup_menu, NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LINK_BUTTON_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("button"));
}
static GMenuModel *
@@ -443,7 +451,9 @@ gtk_link_button_clicked (GtkButton *button)
}
static gboolean
gtk_link_button_popup_menu (GtkWidget *widget)
gtk_link_button_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data)
{
gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), -1, -1);
return TRUE;
+48 -47
View File
@@ -21,7 +21,6 @@
#include "gtkactionhelperprivate.h"
#include "gtkadjustmentprivate.h"
#include "gtkbindings.h"
#include "gtkbuildable.h"
#include "gtkcontainerprivate.h"
#include "gtkcssnodeprivate.h"
@@ -233,7 +232,7 @@ static GSequenceIter * gtk_list_box_get_next_visible (GtkListBo
GSequenceIter *iter);
static void gtk_list_box_apply_filter (GtkListBox *box,
GtkListBoxRow *row);
static void gtk_list_box_add_move_binding (GtkBindingSet *binding_set,
static void gtk_list_box_add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType modmask,
GtkMovementStep step,
@@ -439,9 +438,6 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
GtkBindingSet *binding_set;
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LIST_BOX_ACCESSIBLE);
object_class->get_property = gtk_list_box_get_property;
object_class->set_property = gtk_list_box_set_property;
@@ -615,43 +611,52 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
widget_class->activate_signal = signals[ACTIVATE_CURSOR_ROW];
binding_set = gtk_binding_set_by_class (klass);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Home, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Home, 0,
GTK_MOVEMENT_BUFFER_ENDS, -1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
GTK_MOVEMENT_BUFFER_ENDS, -1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_End, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_End, 0,
GTK_MOVEMENT_BUFFER_ENDS, 1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_End, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_End, 0,
GTK_MOVEMENT_BUFFER_ENDS, 1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Up, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
GTK_MOVEMENT_DISPLAY_LINES, -1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Down, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Down, 0,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
GTK_MOVEMENT_DISPLAY_LINES, 1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
GTK_MOVEMENT_PAGES, -1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
GTK_MOVEMENT_PAGES, -1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
GTK_MOVEMENT_PAGES, 1);
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
GTK_MOVEMENT_PAGES, 1);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
"toggle-cursor-row", 0, NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
"toggle-cursor-row", 0, NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, GDK_CONTROL_MASK,
"toggle-cursor-row",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, GDK_CONTROL_MASK,
"toggle-cursor-row",
NULL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
"select-all", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"unselect-all", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK,
"select-all",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
"unselect-all",
NULL);
gtk_widget_class_set_css_name (widget_class, I_("list"));
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LIST_BOX_ACCESSIBLE);
}
static void
@@ -1439,7 +1444,7 @@ gtk_list_box_set_accept_unpaired_release (GtkListBox *box,
}
static void
gtk_list_box_add_move_binding (GtkBindingSet *binding_set,
gtk_list_box_add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType modmask,
GtkMovementStep step,
@@ -1458,26 +1463,22 @@ gtk_list_box_add_move_binding (GtkBindingSet *binding_set,
GDK_MODIFIER_INTENT_MODIFY_SELECTION);
}
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_binding_entry_add_signal (binding_set, keyval, modmask | modify_mod_mask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask | modify_mod_mask,
"move-cursor", 2,
GTK_TYPE_MOVEMENT_STEP, step,
G_TYPE_INT, count,
NULL);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask,
"move-cursor",
"(ii)", step, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask | extend_mod_mask,
"move-cursor",
"(ii)", step, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask | modify_mod_mask,
"move-cursor",
"(ii)", step, count);
gtk_widget_class_add_binding_signal (widget_class,
keyval, modmask | extend_mod_mask | modify_mod_mask,
"move-cursor",
"(ii)", step, count);
}
static void
+1 -11
View File
@@ -113,7 +113,6 @@
#include "gtkintl.h"
#include "gtkaccelmapprivate.h"
#include "gtkbox.h"
#include "gtkdebug.h"
#include "gtkdndprivate.h"
@@ -665,8 +664,6 @@ do_post_parse_initialization (void)
gsk_ensure_resources ();
_gtk_ensure_resources ();
_gtk_accel_map_init ();
gtk_initialized = TRUE;
#ifdef G_OS_UNIX
@@ -1893,14 +1890,7 @@ gtk_main_do_event (GdkEvent *event)
if (is_pointing_event (event))
target_widget = handle_pointing_event (event);
else if (is_key_event (event))
{
if (event->any.type == GDK_KEY_PRESS &&
GTK_IS_WINDOW (target_widget) &&
gtk_window_activate_key (GTK_WINDOW (target_widget), (GdkEventKey *) event))
goto cleanup;
target_widget = handle_key_event (event);
}
target_widget = handle_key_event (event);
else if (is_focus_event (event))
{
if (!GTK_IS_WINDOW (target_widget))
+84 -295
View File
@@ -86,9 +86,7 @@
#include "gtkmenuprivate.h"
#include "gtkaccellabel.h"
#include "gtkaccelmap.h"
#include "gtkadjustment.h"
#include "gtkbindings.h"
#include "gtkbox.h"
#include "gtkscrolledwindow.h"
#include "gtkcheckmenuitemprivate.h"
@@ -105,7 +103,7 @@
#include "gtkprivate.h"
#include "gtkscrollbar.h"
#include "gtksettings.h"
#include "gtksnapshot.h"
#include "gtkshortcutmanager.h"
#include "gtkstylecontextprivate.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetpath.h"
@@ -150,8 +148,6 @@ enum {
enum {
PROP_0,
PROP_ACTIVE,
PROP_ACCEL_GROUP,
PROP_ACCEL_PATH,
PROP_ATTACH_WIDGET,
PROP_TEAROFF_STATE,
PROP_TEAROFF_TITLE,
@@ -180,7 +176,6 @@ static void gtk_menu_size_allocate (GtkWidget *widget,
int widget_width,
int widget_height,
int baseline);
static void gtk_menu_show (GtkWidget *widget);
static void gtk_menu_motion (GtkEventController *controller,
double x,
double y,
@@ -214,8 +209,6 @@ static GdkSurface *menu_grab_transfer_surface_get (GtkMenu *menu);
static gboolean gtk_menu_real_can_activate_accel (GtkWidget *widget,
guint signal_id);
static void _gtk_menu_refresh_accel_paths (GtkMenu *menu,
gboolean group_changed);
static void gtk_menu_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
@@ -239,7 +232,15 @@ static const gchar attach_data_key[] = "gtk-menu-attach-data";
static guint menu_signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE_WITH_PRIVATE (GtkMenu, gtk_menu, GTK_TYPE_MENU_SHELL)
static void
gtk_menu_shortcut_manager_interface_init (GtkShortcutManagerInterface *iface)
{
}
G_DEFINE_TYPE_WITH_CODE (GtkMenu, gtk_menu, GTK_TYPE_MENU_SHELL,
G_ADD_PRIVATE (GtkMenu)
G_IMPLEMENT_INTERFACE (GTK_TYPE_SHORTCUT_MANAGER,
gtk_menu_shortcut_manager_interface_init))
static void
update_scrollbars (GtkMenu *menu)
@@ -301,7 +302,6 @@ gtk_menu_class_init (GtkMenuClass *class)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
GtkMenuShellClass *menu_shell_class = GTK_MENU_SHELL_CLASS (class);
GtkBindingSet *binding_set;
gobject_class->set_property = gtk_menu_set_property;
gobject_class->get_property = gtk_menu_get_property;
@@ -312,7 +312,6 @@ gtk_menu_class_init (GtkMenuClass *class)
widget_class->realize = gtk_menu_realize;
widget_class->unrealize = gtk_menu_unrealize;
widget_class->size_allocate = gtk_menu_size_allocate;
widget_class->show = gtk_menu_show;
widget_class->focus = gtk_menu_focus;
widget_class->can_activate_accel = gtk_menu_real_can_activate_accel;
widget_class->grab_notify = gtk_menu_grab_notify;
@@ -407,32 +406,6 @@ gtk_menu_class_init (GtkMenuClass *class)
-1, G_MAXINT, -1,
GTK_PARAM_READWRITE));
/**
* GtkMenu:accel-group:
*
* The accel group holding accelerators for the menu.
**/
g_object_class_install_property (gobject_class,
PROP_ACCEL_GROUP,
g_param_spec_object ("accel-group",
P_("Accel Group"),
P_("The accel group holding accelerators for the menu"),
GTK_TYPE_ACCEL_GROUP,
GTK_PARAM_READWRITE));
/**
* GtkMenu:accel-path:
*
* An accel path used to conveniently construct accel paths of child items.
**/
g_object_class_install_property (gobject_class,
PROP_ACCEL_PATH,
g_param_spec_string ("accel-path",
P_("Accel Path"),
P_("An accel path used to conveniently construct accel paths of child items"),
NULL,
GTK_PARAM_READWRITE));
/**
* GtkMenu:attach-widget:
*
@@ -586,87 +559,70 @@ gtk_menu_class_init (GtkMenuClass *class)
G_PARAM_STATIC_BLURB |
G_PARAM_EXPLICIT_NOTIFY));
binding_set = gtk_binding_set_by_class (class);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Up, 0,
I_("move-current"), 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PREV);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Up, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PREV);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Down, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_NEXT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Down, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_NEXT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Left, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PARENT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Left, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PARENT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Right, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_CHILD);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Right, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_CHILD);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Home, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_START);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Home, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_START);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_End, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_END);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_End, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_END);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Page_Up, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_PAGE_UP);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Page_Up, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_PAGE_UP);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Page_Down, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_PAGE_DOWN);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Page_Down, 0,
"move-scroll", 1,
GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_PAGE_DOWN);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Up, 0,
I_("move-current"),
"(i)", GTK_MENU_DIR_PREV);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Up, 0,
"move-current",
"(i)", GTK_MENU_DIR_PREV);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Down, 0,
"move-current",
"(i)", GTK_MENU_DIR_NEXT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Down, 0,
"move-current",
"(i)", GTK_MENU_DIR_NEXT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Left, 0,
"move-current",
"(i)", GTK_MENU_DIR_PARENT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Left, 0,
"move-current",
"(i)", GTK_MENU_DIR_PARENT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Right, 0,
"move-current",
"(i)", GTK_MENU_DIR_CHILD);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Right, 0,
"move-current",
"(i)", GTK_MENU_DIR_CHILD);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Home, 0,
"move-scroll",
"(i)", GTK_SCROLL_START);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Home, 0,
"move-scroll",
"(i)", GTK_SCROLL_START);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_End, 0,
"move-scroll",
"(i)", GTK_SCROLL_END);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_End, 0,
"move-scroll",
"(i)", GTK_SCROLL_END);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Up, 0,
"move-scroll",
"(i)", GTK_SCROLL_PAGE_UP);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Page_Up, 0,
"move-scroll",
"(i)", GTK_SCROLL_PAGE_UP);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Down, 0,
"move-scroll",
"(i)", GTK_SCROLL_PAGE_DOWN);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Page_Down, 0,
"move-scroll",
"(i)", GTK_SCROLL_PAGE_DOWN);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_MENU_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("menu"));
@@ -686,12 +642,6 @@ gtk_menu_set_property (GObject *object,
case PROP_ACTIVE:
gtk_menu_set_active (menu, g_value_get_int (value));
break;
case PROP_ACCEL_GROUP:
gtk_menu_set_accel_group (menu, g_value_get_object (value));
break;
case PROP_ACCEL_PATH:
gtk_menu_set_accel_path (menu, g_value_get_string (value));
break;
case PROP_ATTACH_WIDGET:
{
GtkWidget *widget;
@@ -762,12 +712,6 @@ gtk_menu_get_property (GObject *object,
g_list_free (children);
}
break;
case PROP_ACCEL_GROUP:
g_value_set_object (value, gtk_menu_get_accel_group (menu));
break;
case PROP_ACCEL_PATH:
g_value_set_string (value, gtk_menu_get_accel_path (menu));
break;
case PROP_ATTACH_WIDGET:
g_value_set_object (value, gtk_menu_get_attach_widget (menu));
break;
@@ -801,6 +745,7 @@ gtk_menu_init (GtkMenu *menu)
GtkMenuPrivate *priv;
GtkGesture *gesture;
GtkEventController *controller;
GList *l, *controllers;
priv = gtk_menu_get_instance_private (menu);
@@ -811,7 +756,6 @@ gtk_menu_init (GtkMenu *menu)
g_signal_connect (priv->toplevel, "destroy", G_CALLBACK (gtk_widget_destroyed), &priv->toplevel);
gtk_window_set_resizable (GTK_WINDOW (priv->toplevel), FALSE);
gtk_window_set_mnemonic_modifier (GTK_WINDOW (priv->toplevel), 0);
_gtk_window_request_csd (GTK_WINDOW (priv->toplevel));
gtk_style_context_add_class (gtk_widget_get_style_context (priv->toplevel),
@@ -854,6 +798,15 @@ gtk_menu_init (GtkMenu *menu)
controller = gtk_event_controller_motion_new ();
g_signal_connect (controller, "motion", G_CALLBACK (gtk_menu_motion), menu);
gtk_widget_add_controller (GTK_WIDGET (menu), controller);
/* Trigger mnemonics without Alt */
controllers = _gtk_widget_list_controllers (GTK_WIDGET (menu), GTK_PHASE_CAPTURE);
for (l = controllers; l; l = l->next)
{
if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
gtk_shortcut_controller_set_mnemonics_modifiers (l->data, 0);
}
g_list_free (controllers);
}
static void
@@ -893,8 +846,6 @@ gtk_menu_destroy (GtkWidget *widget)
g_object_ref (widget);
}
g_clear_object (&priv->accel_group);
if (priv->toplevel)
{
g_signal_handlers_disconnect_by_func (priv->toplevel, moved_to_rect_cb, menu);
@@ -1824,57 +1775,6 @@ gtk_menu_set_active (GtkMenu *menu,
g_list_free (children);
}
/**
* gtk_menu_set_accel_group:
* @menu: a #GtkMenu
* @accel_group: (allow-none): the #GtkAccelGroup to be associated
* with the menu.
*
* Set the #GtkAccelGroup which holds global accelerators for the
* menu. This accelerator group needs to also be added to all windows
* that this menu is being used in with gtk_window_add_accel_group(),
* in order for those windows to support all the accelerators
* contained in this group.
*/
void
gtk_menu_set_accel_group (GtkMenu *menu,
GtkAccelGroup *accel_group)
{
GtkMenuPrivate *priv;
g_return_if_fail (GTK_IS_MENU (menu));
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
priv = menu->priv;
if (priv->accel_group != accel_group)
{
if (priv->accel_group)
g_object_unref (priv->accel_group);
priv->accel_group = accel_group;
if (priv->accel_group)
g_object_ref (priv->accel_group);
_gtk_menu_refresh_accel_paths (menu, TRUE);
}
}
/**
* gtk_menu_get_accel_group:
* @menu: a #GtkMenu
*
* Gets the #GtkAccelGroup which holds global accelerators for the
* menu. See gtk_menu_set_accel_group().
*
* Returns: (transfer none): the #GtkAccelGroup associated with the menu
*/
GtkAccelGroup*
gtk_menu_get_accel_group (GtkMenu *menu)
{
g_return_val_if_fail (GTK_IS_MENU (menu), NULL);
return menu->priv->accel_group;
}
static gboolean
gtk_menu_real_can_activate_accel (GtkWidget *widget,
guint signal_id)
@@ -1893,107 +1793,6 @@ gtk_menu_real_can_activate_accel (GtkWidget *widget,
return gtk_widget_is_sensitive (widget);
}
/**
* gtk_menu_set_accel_path:
* @menu: a valid #GtkMenu
* @accel_path: (nullable): a valid accelerator path, or %NULL to unset the path
*
* Sets an accelerator path for this menu from which accelerator paths
* for its immediate children, its menu items, can be constructed.
* The main purpose of this function is to spare the programmer the
* inconvenience of having to call gtk_menu_item_set_accel_path() on
* each menu item that should support runtime user changable accelerators.
* Instead, by just calling gtk_menu_set_accel_path() on their parent,
* each menu item of this menu, that contains a label describing its
* purpose, automatically gets an accel path assigned.
*
* For example, a menu containing menu items New and Exit, will, after
* `gtk_menu_set_accel_path (menu, "<Gnumeric-Sheet>/File");` has been
* called, assign its items the accel paths: `"<Gnumeric-Sheet>/File/New"`
* and `"<Gnumeric-Sheet>/File/Exit"`.
*
* Assigning accel paths to menu items then enables the user to change
* their accelerators at runtime. More details about accelerator paths
* and their default setups can be found at gtk_accel_map_add_entry().
*
* Note that @accel_path string will be stored in a #GQuark. Therefore,
* if you pass a static string, you can save some memory by interning
* it first with g_intern_static_string().
*/
void
gtk_menu_set_accel_path (GtkMenu *menu,
const gchar *accel_path)
{
GtkMenuPrivate *priv;
g_return_if_fail (GTK_IS_MENU (menu));
priv = menu->priv;
if (accel_path)
g_return_if_fail (accel_path[0] == '<' && strchr (accel_path, '/')); /* simplistic check */
priv->accel_path = g_intern_string (accel_path);
if (priv->accel_path)
_gtk_menu_refresh_accel_paths (menu, FALSE);
}
/**
* gtk_menu_get_accel_path:
* @menu: a valid #GtkMenu
*
* Retrieves the accelerator path set on the menu.
*
* Returns: the accelerator path set on the menu.
*/
const gchar*
gtk_menu_get_accel_path (GtkMenu *menu)
{
g_return_val_if_fail (GTK_IS_MENU (menu), NULL);
return menu->priv->accel_path;
}
typedef struct {
GtkMenu *menu;
gboolean group_changed;
} AccelPropagation;
static void
refresh_accel_paths_foreach (GtkWidget *widget,
gpointer data)
{
GtkMenuPrivate *priv;
AccelPropagation *prop = data;
if (GTK_IS_MENU_ITEM (widget)) /* should always be true */
{
priv = prop->menu->priv;
_gtk_menu_item_refresh_accel_path (GTK_MENU_ITEM (widget),
priv->accel_path,
priv->accel_group,
prop->group_changed);
}
}
static void
_gtk_menu_refresh_accel_paths (GtkMenu *menu,
gboolean group_changed)
{
GtkMenuPrivate *priv = menu->priv;
if (priv->accel_path && priv->accel_group)
{
AccelPropagation prop;
prop.menu = menu;
prop.group_changed = group_changed;
gtk_container_foreach (GTK_CONTAINER (menu),
refresh_accel_paths_foreach,
&prop);
}
}
/**
* gtk_menu_reposition:
* @menu: a #GtkMenu
@@ -2130,16 +1929,6 @@ gtk_menu_size_allocate (GtkWidget *widget,
baseline);
}
static void
gtk_menu_show (GtkWidget *widget)
{
GtkMenu *menu = GTK_MENU (widget);
_gtk_menu_refresh_accel_paths (menu, FALSE);
GTK_WIDGET_CLASS (gtk_menu_parent_class)->show (widget);
}
static void
gtk_menu_measure (GtkWidget *widget,
GtkOrientation orientation,
-11
View File
@@ -88,17 +88,6 @@ GDK_AVAILABLE_IN_ALL
void gtk_menu_set_active (GtkMenu *menu,
guint index);
GDK_AVAILABLE_IN_ALL
void gtk_menu_set_accel_group (GtkMenu *menu,
GtkAccelGroup *accel_group);
GDK_AVAILABLE_IN_ALL
GtkAccelGroup* gtk_menu_get_accel_group (GtkMenu *menu);
GDK_AVAILABLE_IN_ALL
void gtk_menu_set_accel_path (GtkMenu *menu,
const gchar *accel_path);
GDK_AVAILABLE_IN_ALL
const gchar* gtk_menu_get_accel_path (GtkMenu *menu);
GDK_AVAILABLE_IN_ALL
void gtk_menu_attach_to_widget (GtkMenu *menu,
GtkWidget *attach_widget,
+40 -59
View File
@@ -42,7 +42,6 @@
#include "gtkmenubar.h"
#include "gtkmenubarprivate.h"
#include "gtkbindings.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkmenuitemprivate.h"
@@ -113,12 +112,6 @@ gtk_menu_bar_get_items (GtkMenuShell *menu_shell)
return gtk_container_get_children (GTK_CONTAINER (menu_bar->box));
}
static void
gtk_menu_bar_finalize (GObject *object)
{
G_OBJECT_CLASS (gtk_menu_bar_parent_class)->finalize (object);
}
static void
gtk_menu_bar_dispose (GObject *object)
{
@@ -148,9 +141,6 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
GtkMenuShellClass *menu_shell_class = GTK_MENU_SHELL_CLASS (class);
GtkBindingSet *binding_set;
object_class->finalize = gtk_menu_bar_finalize;
object_class->dispose = gtk_menu_bar_dispose;
widget_class->measure = gtk_menu_bar_measure;
@@ -168,47 +158,38 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
menu_shell_class->move_current = gtk_menu_bar_move_current;
menu_shell_class->get_items = gtk_menu_bar_get_items;
binding_set = gtk_binding_set_by_class (class);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Left, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PREV);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Left, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PREV);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Right, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_NEXT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Right, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_NEXT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Up, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PARENT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Up, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_PARENT);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Down, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_CHILD);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Down, 0,
"move-current", 1,
GTK_TYPE_MENU_DIRECTION_TYPE,
GTK_MENU_DIR_CHILD);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Left, 0,
"move-current",
"(i)", GTK_MENU_DIR_PREV);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Left, 0,
"move-current",
"(i)", GTK_MENU_DIR_PREV);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Right, 0,
"move-current",
"(i)", GTK_MENU_DIR_NEXT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Right, 0,
"move-current",
"(i)", GTK_MENU_DIR_NEXT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Up, 0,
"move-current",
"(i)", GTK_MENU_DIR_PARENT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Up, 0,
"move-current",
"(i)", GTK_MENU_DIR_PARENT);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Down, 0,
"move-current",
"(i)", GTK_MENU_DIR_CHILD);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Down, 0,
"move-current",
"(i)", GTK_MENU_DIR_CHILD);
gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_MENU_BAR);
gtk_widget_class_set_css_name (widget_class, I_("menubar"));
@@ -285,15 +266,15 @@ _gtk_menu_bar_get_viewable_menu_bars (GtkWindow *window)
gboolean viewable = TRUE;
while (widget)
{
if (!gtk_widget_get_mapped (widget))
viewable = FALSE;
{
if (!gtk_widget_get_mapped (widget))
viewable = FALSE;
widget = gtk_widget_get_parent (widget);
}
}
if (viewable)
viewable_menu_bars = g_list_prepend (viewable_menu_bars, menu_bars->data);
viewable_menu_bars = g_list_prepend (viewable_menu_bars, menu_bars->data);
}
return g_list_reverse (viewable_menu_bars);
@@ -301,7 +282,7 @@ _gtk_menu_bar_get_viewable_menu_bars (GtkWindow *window)
static void
set_menu_bars (GtkWindow *window,
GList *menubars)
GList *menubars)
{
g_object_set_data (G_OBJECT (window), I_("gtk-menu-bar-list"), menubars);
}
@@ -358,7 +339,7 @@ gtk_menu_bar_unroot (GtkWidget *widget)
**/
void
_gtk_menu_bar_cycle_focus (GtkMenuBar *menubar,
GtkDirectionType dir)
GtkDirectionType dir)
{
GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (menubar)));
GtkMenuItem *to_activate = NULL;
@@ -408,7 +389,7 @@ gtk_menu_bar_get_popup_delay (GtkMenuShell *menu_shell)
static void
gtk_menu_bar_move_current (GtkMenuShell *menu_shell,
GtkMenuDirectionType direction)
GtkMenuDirectionType direction)
{
GtkMenuBar *menubar = GTK_MENU_BAR (menu_shell);
-228
View File
@@ -125,7 +125,6 @@ enum {
enum {
PROP_0,
PROP_SUBMENU,
PROP_ACCEL_PATH,
PROP_LABEL,
PROP_USE_UNDERLINE,
@@ -193,11 +192,6 @@ static void gtk_menu_item_buildable_add_child (GtkBuildable *buildab
GtkBuilder *builder,
GObject *child,
const gchar *type);
static void gtk_menu_item_buildable_custom_finished(GtkBuildable *buildable,
GtkBuilder *builder,
GObject *child,
const gchar *tagname,
gpointer user_data);
static void gtk_menu_item_actionable_interface_init (GtkActionableInterface *iface);
@@ -607,20 +601,6 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass)
GTK_TYPE_MENU,
GTK_PARAM_READWRITE);
/**
* GtkMenuItem:accel-path:
*
* Sets the accelerator path of the menu item, through which runtime
* changes of the menu item's accelerator caused by the user can be
* identified and saved to persistant storage.
*/
menu_item_props[PROP_ACCEL_PATH] =
g_param_spec_string ("accel-path",
P_("Accel Path"),
P_("Sets the accelerator path of the menu item"),
NULL,
GTK_PARAM_READWRITE);
/**
* GtkMenuItem:label:
*
@@ -760,9 +740,6 @@ gtk_menu_item_set_property (GObject *object,
case PROP_SUBMENU:
gtk_menu_item_set_submenu (menu_item, g_value_get_object (value));
break;
case PROP_ACCEL_PATH:
gtk_menu_item_set_accel_path (menu_item, g_value_get_string (value));
break;
case PROP_LABEL:
gtk_menu_item_set_label (menu_item, g_value_get_string (value));
break;
@@ -795,9 +772,6 @@ gtk_menu_item_get_property (GObject *object,
case PROP_SUBMENU:
g_value_set_object (value, gtk_menu_item_get_submenu (menu_item));
break;
case PROP_ACCEL_PATH:
g_value_set_string (value, gtk_menu_item_get_accel_path (menu_item));
break;
case PROP_LABEL:
g_value_set_string (value, gtk_menu_item_get_label (menu_item));
break;
@@ -846,7 +820,6 @@ gtk_menu_item_buildable_interface_init (GtkBuildableIface *iface)
{
parent_buildable_iface = g_type_interface_peek_parent (iface);
iface->add_child = gtk_menu_item_buildable_add_child;
iface->custom_finished = gtk_menu_item_buildable_custom_finished;
}
static void
@@ -862,46 +835,6 @@ gtk_menu_item_buildable_add_child (GtkBuildable *buildable,
parent_buildable_iface->add_child (buildable, builder, child, type);
}
static void
gtk_menu_item_buildable_custom_finished (GtkBuildable *buildable,
GtkBuilder *builder,
GObject *child,
const gchar *tagname,
gpointer user_data)
{
GtkWidget *toplevel;
if (strcmp (tagname, "accelerator") == 0)
{
GtkMenuShell *menu_shell;
GtkWidget *attach;
menu_shell = gtk_menu_item_get_menu_shell (GTK_MENU_ITEM (buildable));
if (menu_shell)
{
while (GTK_IS_MENU (menu_shell) &&
(attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (attach));
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (menu_shell)));
}
else
{
/* Fall back to something ... */
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (buildable)));
g_warning ("found a GtkMenuItem '%s' without a parent GtkMenuShell, assigned accelerators wont work.",
gtk_buildable_get_name (buildable));
}
/* Feed the correct toplevel to the GtkWidget accelerator parsing code */
_gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), toplevel, user_data);
}
else
parent_buildable_iface->custom_finished (buildable, builder, child, tagname, user_data);
}
static void
update_arrow_classes (GtkMenuItem *menu_item)
{
@@ -1600,44 +1533,12 @@ gtk_menu_item_can_activate_accel (GtkWidget *widget,
menu_shell && gtk_widget_can_activate_accel (GTK_WIDGET (menu_shell), signal_id));
}
static void
gtk_menu_item_accel_name_foreach (GtkWidget *widget,
gpointer data)
{
const gchar **path_p = data;
if (!*path_p)
{
if (GTK_IS_LABEL (widget))
{
*path_p = gtk_label_get_text (GTK_LABEL (widget));
if (*path_p && (*path_p)[0] == 0)
*path_p = NULL;
}
else if (GTK_IS_CONTAINER (widget))
gtk_container_foreach (GTK_CONTAINER (widget),
gtk_menu_item_accel_name_foreach,
data);
}
}
static void
gtk_menu_item_parent_cb (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
GtkMenuItem *menu_item = GTK_MENU_ITEM (object);
GtkMenu *menu;
GtkMenuShell *menu_shell;
menu_shell = gtk_menu_item_get_menu_shell (menu_item);
menu = GTK_IS_MENU (menu_shell) ? GTK_MENU (menu_shell) : NULL;
if (menu)
_gtk_menu_item_refresh_accel_path (menu_item,
menu->priv->accel_path,
menu->priv->accel_group,
TRUE);
update_arrow_widget (menu_item);
}
@@ -1653,133 +1554,6 @@ gtk_menu_item_direction_changed (GtkWidget *widget,
GTK_WIDGET_CLASS (gtk_menu_item_parent_class)->direction_changed (widget, previous_dir);
}
void
_gtk_menu_item_refresh_accel_path (GtkMenuItem *menu_item,
const gchar *prefix,
GtkAccelGroup *accel_group,
gboolean group_changed)
{
GtkMenuItemPrivate *priv = menu_item->priv;
const gchar *path;
GtkWidget *widget;
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
g_return_if_fail (!accel_group || GTK_IS_ACCEL_GROUP (accel_group));
widget = GTK_WIDGET (menu_item);
if (!accel_group)
{
gtk_widget_set_accel_path (widget, NULL, NULL);
return;
}
path = _gtk_widget_get_accel_path (widget, NULL);
if (!path) /* no active accel_path yet */
{
path = priv->accel_path;
if (!path && prefix)
{
const gchar *postfix = NULL;
gchar *new_path;
/* try to construct one from label text */
gtk_container_foreach (GTK_CONTAINER (menu_item),
gtk_menu_item_accel_name_foreach,
&postfix);
if (postfix)
{
new_path = g_strconcat (prefix, "/", postfix, NULL);
path = priv->accel_path = g_intern_string (new_path);
g_free (new_path);
}
}
if (path)
gtk_widget_set_accel_path (widget, path, accel_group);
}
else if (group_changed) /* reinstall accelerators */
gtk_widget_set_accel_path (widget, path, accel_group);
}
/**
* gtk_menu_item_set_accel_path:
* @menu_item: a valid #GtkMenuItem
* @accel_path: (allow-none): accelerator path, corresponding to this menu
* items functionality, or %NULL to unset the current path.
*
* Set the accelerator path on @menu_item, through which runtime
* changes of the menu items accelerator caused by the user can be
* identified and saved to persistent storage (see gtk_accel_map_save()
* on this). To set up a default accelerator for this menu item, call
* gtk_accel_map_add_entry() with the same @accel_path. See also
* gtk_accel_map_add_entry() on the specifics of accelerator paths,
* and gtk_menu_set_accel_path() for a more convenient variant of
* this function.
*
* This function is basically a convenience wrapper that handles
* calling gtk_widget_set_accel_path() with the appropriate accelerator
* group for the menu item.
*
* Note that you do need to set an accelerator on the parent menu with
* gtk_menu_set_accel_group() for this to work.
*
* Note that @accel_path string will be stored in a #GQuark.
* Therefore, if you pass a static string, you can save some memory
* by interning it first with g_intern_static_string().
*/
void
gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
const gchar *accel_path)
{
GtkMenuItemPrivate *priv = menu_item->priv;
GtkWidget *widget;
GtkMenuShell *menu_shell;
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
g_return_if_fail (accel_path == NULL ||
(accel_path[0] == '<' && strchr (accel_path, '/')));
widget = GTK_WIDGET (menu_item);
/* store new path */
priv->accel_path = g_intern_string (accel_path);
/* forget accelerators associated with old path */
gtk_widget_set_accel_path (widget, NULL, NULL);
/* install accelerators associated with new path */
menu_shell = gtk_menu_item_get_menu_shell (menu_item);
if (GTK_IS_MENU (menu_shell))
{
GtkMenu *menu = GTK_MENU (menu_shell);
if (menu->priv->accel_group)
_gtk_menu_item_refresh_accel_path (GTK_MENU_ITEM (widget),
NULL,
menu->priv->accel_group,
FALSE);
}
}
/**
* gtk_menu_item_get_accel_path:
* @menu_item: a valid #GtkMenuItem
*
* Retrieve the accelerator path that was previously set on @menu_item.
*
* See gtk_menu_item_set_accel_path() for details.
*
* Returns: (nullable) (transfer none): the accelerator path corresponding to
* this menu items functionality, or %NULL if not set
*/
const gchar *
gtk_menu_item_get_accel_path (GtkMenuItem *menu_item)
{
g_return_val_if_fail (GTK_IS_MENU_ITEM (menu_item), NULL);
return menu_item->priv->accel_path;
}
static void
gtk_menu_item_forall (GtkContainer *container,
GtkCallback callback,
@@ -1820,8 +1594,6 @@ gtk_menu_item_ensure_label (GtkMenuItem *menu_item)
gtk_widget_set_valign (accel_label, GTK_ALIGN_CENTER);
gtk_container_add (GTK_CONTAINER (menu_item), accel_label);
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label),
GTK_WIDGET (menu_item));
}
}
-5
View File
@@ -129,11 +129,6 @@ void gtk_menu_item_toggle_size_request (GtkMenuItem *menu_item,
GDK_AVAILABLE_IN_ALL
void gtk_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
gint allocation);
GDK_AVAILABLE_IN_ALL
void gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
const gchar *accel_path);
GDK_AVAILABLE_IN_ALL
const gchar * gtk_menu_item_get_accel_path (GtkMenuItem *menu_item);
GDK_AVAILABLE_IN_ALL
void gtk_menu_item_set_label (GtkMenuItem *menu_item,
-6
View File
@@ -35,8 +35,6 @@ struct _GtkMenuItemPrivate
guint timer;
const char *accel_path;
GtkActionHelper *action_helper;
GtkWidget *arrow_widget;
@@ -49,10 +47,6 @@ struct _GtkMenuItemPrivate
guint reserve_indicator : 1;
};
void _gtk_menu_item_refresh_accel_path (GtkMenuItem *menu_item,
const gchar *prefix,
GtkAccelGroup *accel_group,
gboolean group_changed);
gboolean _gtk_menu_item_is_selectable (GtkWidget *menu_item);
void _gtk_menu_item_popup_submenu (GtkWidget *menu_item,
gboolean with_delay);
-3
View File
@@ -51,9 +51,6 @@ struct _GtkMenuPrivate
GtkWidget *parent_menu_item;
GtkWidget *old_active_menu_item;
GtkAccelGroup *accel_group;
const char *accel_path;
gint position_x;
gint position_y;
+36 -203
View File
@@ -59,7 +59,6 @@
#include "gtkmenushellprivate.h"
#include "gtkbindings.h"
#include "gtkintl.h"
#include "gtkkeyhash.h"
#include "gtklabelprivate.h"
@@ -67,7 +66,6 @@
#include "gtkmarshalers.h"
#include "gtkmenubarprivate.h"
#include "gtkmenuitemprivate.h"
#include "gtkmnemonichash.h"
#include "gtkmodelmenuitemprivate.h"
#include "gtkprivate.h"
#include "gtkseparatormenuitem.h"
@@ -111,14 +109,12 @@ static void gtk_menu_shell_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gtk_menu_shell_finalize (GObject *object);
static void gtk_menu_shell_dispose (GObject *object);
static gboolean gtk_menu_shell_key_press (GtkEventControllerKey *key,
guint keyval,
guint keycode,
GdkModifierType modifiers,
GtkWidget *widget);
static void gtk_menu_shell_root (GtkWidget *widget);
static void click_pressed (GtkGestureClick *gesture,
gint n_press,
gdouble x,
@@ -151,11 +147,6 @@ static void gtk_real_menu_shell_cancel (GtkMenuShell *menu_shell)
static void gtk_real_menu_shell_cycle_focus (GtkMenuShell *menu_shell,
GtkDirectionType dir);
static void gtk_menu_shell_reset_key_hash (GtkMenuShell *menu_shell);
static gboolean gtk_menu_shell_activate_mnemonic (GtkMenuShell *menu_shell,
guint keycode,
GdkModifierType state,
guint group);
static gboolean gtk_menu_shell_real_move_selected (GtkMenuShell *menu_shell,
gint distance);
@@ -166,23 +157,14 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkMenuShell, gtk_menu_shell, GTK_TYPE_CONT
static void
gtk_menu_shell_class_init (GtkMenuShellClass *klass)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
GtkBindingSet *binding_set;
object_class = (GObjectClass*) klass;
widget_class = (GtkWidgetClass*) klass;
container_class = (GtkContainerClass*) klass;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
object_class->set_property = gtk_menu_shell_set_property;
object_class->get_property = gtk_menu_shell_get_property;
object_class->finalize = gtk_menu_shell_finalize;
object_class->dispose = gtk_menu_shell_dispose;
widget_class->root = gtk_menu_shell_root;
container_class->add = gtk_menu_shell_add;
container_class->remove = gtk_menu_shell_remove;
container_class->child_type = gtk_menu_shell_child_type;
@@ -343,43 +325,38 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
_gtk_marshal_VOID__OBJECT_INTv);
binding_set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Escape, 0,
"cancel", 0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Return, 0,
"activate-current", 1,
G_TYPE_BOOLEAN,
TRUE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_ISO_Enter, 0,
"activate-current", 1,
G_TYPE_BOOLEAN,
TRUE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Enter, 0,
"activate-current", 1,
G_TYPE_BOOLEAN,
TRUE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_space, 0,
"activate-current", 1,
G_TYPE_BOOLEAN,
FALSE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Space, 0,
"activate-current", 1,
G_TYPE_BOOLEAN,
FALSE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_F10, 0,
"cycle-focus", 1,
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_FORWARD);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_F10, GDK_SHIFT_MASK,
"cycle-focus", 1,
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_BACKWARD);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"cancel",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Return, 0,
"activate-current",
"(b)", TRUE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_ISO_Enter, 0,
"activate-current",
"(b)", TRUE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Enter, 0,
"activate-current",
"(b)", TRUE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, 0,
"activate-current",
"(b)", FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, 0,
"activate-current",
"(b)", FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_F10, 0,
"cycle-focus",
"(i)", GTK_DIR_TAB_FORWARD);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_F10, GDK_SHIFT_MASK,
"cycle-focus",
"(i)", GTK_DIR_TAB_BACKWARD);
/**
* GtkMenuShell:take-focus:
@@ -470,21 +447,6 @@ gtk_menu_shell_get_property (GObject *object,
}
}
static void
gtk_menu_shell_finalize (GObject *object)
{
GtkMenuShell *menu_shell = GTK_MENU_SHELL (object);
GtkMenuShellPrivate *priv = menu_shell->priv;
if (priv->mnemonic_hash)
_gtk_mnemonic_hash_free (priv->mnemonic_hash);
if (priv->key_hash)
_gtk_key_hash_free (priv->key_hash);
G_OBJECT_CLASS (gtk_menu_shell_parent_class)->finalize (object);
}
static void
gtk_menu_shell_dispose (GObject *object)
{
@@ -921,16 +883,7 @@ gtk_menu_shell_key_press (GtkEventControllerKey *key,
priv->parent_menu_shell)
return gtk_event_controller_key_forward (key, priv->parent_menu_shell);
return gtk_menu_shell_activate_mnemonic (menu_shell, keycode, modifiers,
gtk_event_controller_key_get_group (key));
}
static void
gtk_menu_shell_root (GtkWidget *widget)
{
GTK_WIDGET_CLASS (gtk_menu_shell_parent_class)->root (widget);
gtk_menu_shell_reset_key_hash (GTK_MENU_SHELL (widget));
return FALSE;
}
static void
@@ -1478,126 +1431,6 @@ gtk_menu_shell_cancel (GtkMenuShell *menu_shell)
g_signal_emit (menu_shell, menu_shell_signals[CANCEL], 0);
}
static GtkMnemonicHash *
gtk_menu_shell_get_mnemonic_hash (GtkMenuShell *menu_shell,
gboolean create)
{
GtkMenuShellPrivate *priv = menu_shell->priv;
if (!priv->mnemonic_hash && create)
priv->mnemonic_hash = _gtk_mnemonic_hash_new ();
return priv->mnemonic_hash;
}
static void
menu_shell_add_mnemonic_foreach (guint keyval,
GSList *targets,
gpointer data)
{
GtkKeyHash *key_hash = data;
_gtk_key_hash_add_entry (key_hash, keyval, 0, GUINT_TO_POINTER (keyval));
}
static GtkKeyHash *
gtk_menu_shell_get_key_hash (GtkMenuShell *menu_shell,
gboolean create)
{
GtkMenuShellPrivate *priv = menu_shell->priv;
GtkWidget *widget = GTK_WIDGET (menu_shell);
if (!priv->key_hash && create)
{
GtkMnemonicHash *mnemonic_hash = gtk_menu_shell_get_mnemonic_hash (menu_shell, FALSE);
GdkKeymap *keymap = gdk_display_get_keymap (gtk_widget_get_display (widget));
if (!mnemonic_hash)
return NULL;
priv->key_hash = _gtk_key_hash_new (keymap, NULL);
_gtk_mnemonic_hash_foreach (mnemonic_hash,
menu_shell_add_mnemonic_foreach,
priv->key_hash);
}
return priv->key_hash;
}
static void
gtk_menu_shell_reset_key_hash (GtkMenuShell *menu_shell)
{
GtkMenuShellPrivate *priv = menu_shell->priv;
if (priv->key_hash)
{
_gtk_key_hash_free (priv->key_hash);
priv->key_hash = NULL;
}
}
static gboolean
gtk_menu_shell_activate_mnemonic (GtkMenuShell *menu_shell,
guint keycode,
GdkModifierType state,
guint group)
{
GtkMnemonicHash *mnemonic_hash;
GtkKeyHash *key_hash;
GSList *entries;
gboolean result = FALSE;
mnemonic_hash = gtk_menu_shell_get_mnemonic_hash (menu_shell, FALSE);
if (!mnemonic_hash)
return FALSE;
key_hash = gtk_menu_shell_get_key_hash (menu_shell, TRUE);
if (!key_hash)
return FALSE;
entries = _gtk_key_hash_lookup (key_hash,
keycode,
state,
gtk_accelerator_get_default_mod_mask (),
group);
if (entries)
{
result = _gtk_mnemonic_hash_activate (mnemonic_hash,
GPOINTER_TO_UINT (entries->data));
g_slist_free (entries);
}
return result;
}
void
_gtk_menu_shell_add_mnemonic (GtkMenuShell *menu_shell,
guint keyval,
GtkWidget *target)
{
g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
g_return_if_fail (GTK_IS_WIDGET (target));
_gtk_mnemonic_hash_add (gtk_menu_shell_get_mnemonic_hash (menu_shell, TRUE),
keyval, target);
gtk_menu_shell_reset_key_hash (menu_shell);
}
void
_gtk_menu_shell_remove_mnemonic (GtkMenuShell *menu_shell,
guint keyval,
GtkWidget *target)
{
g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
g_return_if_fail (GTK_IS_WIDGET (target));
_gtk_mnemonic_hash_remove (gtk_menu_shell_get_mnemonic_hash (menu_shell, TRUE),
keyval, target);
gtk_menu_shell_reset_key_hash (menu_shell);
}
void
_gtk_menu_shell_set_grab_device (GtkMenuShell *menu_shell,
GdkDevice *device)
-11
View File
@@ -20,7 +20,6 @@
#include <gtk/gtkmenushell.h>
#include <gtk/gtkmnemonichash.h>
#include <gtk/gtkkeyhash.h>
#include <gtk/gtkmenutrackerprivate.h>
#include <gtk/gtkeventcontroller.h>
@@ -65,9 +64,6 @@ struct _GtkMenuShellPrivate
* signal is coming soon (when checked
* from inside of a "hide" handler).
*/
GtkMnemonicHash *mnemonic_hash;
GtkKeyHash *key_hash;
GdkDevice *grab_pointer;
GtkEventController *key_controller;
};
@@ -79,13 +75,6 @@ void _gtk_menu_shell_set_grab_device (GtkMenuShell *menu_shell,
GdkDevice *device);
GdkDevice *_gtk_menu_shell_get_grab_device (GtkMenuShell *menu_shell);
void _gtk_menu_shell_add_mnemonic (GtkMenuShell *menu_shell,
guint keyval,
GtkWidget *target);
void _gtk_menu_shell_remove_mnemonic (GtkMenuShell *menu_shell,
guint keyval,
GtkWidget *target);
void _gtk_menu_shell_update_mnemonics (GtkMenuShell *menu_shell);
void _gtk_menu_shell_set_keyboard_mode (GtkMenuShell *menu_shell,
gboolean keyboard_mode);
-201
View File
@@ -1,201 +0,0 @@
/* gtkmnemonichash.c: Sets of mnemonics with cycling
*
* GTK - The GIMP Toolkit
* Copyright (C) 2002, Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "gtkmnemonichash.h"
#include "gtknative.h"
struct _GtkMnemnonicHash
{
GHashTable *hash;
};
GtkMnemonicHash *
_gtk_mnemonic_hash_new (void)
{
GtkMnemonicHash *mnemonic_hash = g_new (GtkMnemonicHash, 1);
mnemonic_hash->hash = g_hash_table_new (g_direct_hash, NULL);
return mnemonic_hash;
}
static void
mnemonic_hash_free_foreach (gpointer key,
gpointer value,
gpointer user)
{
guint keyval = GPOINTER_TO_UINT (key);
GSList *targets = value;
gchar *name = gtk_accelerator_name (keyval, 0);
g_warning ("mnemonic \"%s\" wasn't removed for widget (%p)",
name, targets->data);
g_free (name);
g_slist_free (targets);
}
void
_gtk_mnemonic_hash_free (GtkMnemonicHash *mnemonic_hash)
{
g_hash_table_foreach (mnemonic_hash->hash,
mnemonic_hash_free_foreach,
NULL);
g_hash_table_destroy (mnemonic_hash->hash);
g_free (mnemonic_hash);
}
void
_gtk_mnemonic_hash_add (GtkMnemonicHash *mnemonic_hash,
guint keyval,
GtkWidget *target)
{
gpointer key = GUINT_TO_POINTER (keyval);
GSList *targets, *new_targets;
g_return_if_fail (GTK_IS_WIDGET (target));
targets = g_hash_table_lookup (mnemonic_hash->hash, key);
g_return_if_fail (g_slist_find (targets, target) == NULL);
new_targets = g_slist_append (targets, target);
if (new_targets != targets)
g_hash_table_insert (mnemonic_hash->hash, key, new_targets);
}
void
_gtk_mnemonic_hash_remove (GtkMnemonicHash *mnemonic_hash,
guint keyval,
GtkWidget *target)
{
gpointer key = GUINT_TO_POINTER (keyval);
GSList *targets, *new_targets;
g_return_if_fail (GTK_IS_WIDGET (target));
targets = g_hash_table_lookup (mnemonic_hash->hash, key);
g_return_if_fail (targets && g_slist_find (targets, target) != NULL);
new_targets = g_slist_remove (targets, target);
if (new_targets != targets)
{
if (new_targets == NULL)
g_hash_table_remove (mnemonic_hash->hash, key);
else
g_hash_table_insert (mnemonic_hash->hash, key, new_targets);
}
}
gboolean
_gtk_mnemonic_hash_activate (GtkMnemonicHash *mnemonic_hash,
guint keyval)
{
GSList *list, *targets;
GtkWidget *widget, *chosen_widget;
GdkSurface *surface;
gboolean overloaded;
targets = g_hash_table_lookup (mnemonic_hash->hash,
GUINT_TO_POINTER (keyval));
if (!targets)
return FALSE;
overloaded = FALSE;
chosen_widget = NULL;
for (list = targets; list; list = list->next)
{
widget = GTK_WIDGET (list->data);
surface = gtk_native_get_surface (gtk_widget_get_native (widget));
if (gtk_widget_is_sensitive (widget) &&
gtk_widget_get_mapped (widget) &&
surface && gdk_surface_is_viewable (surface))
{
if (chosen_widget)
{
overloaded = TRUE;
break;
}
else
chosen_widget = widget;
}
}
if (chosen_widget)
{
/* For round robin we put the activated entry on
* the end of the list after activation
*/
targets = g_slist_remove (targets, chosen_widget);
targets = g_slist_append (targets, chosen_widget);
g_hash_table_insert (mnemonic_hash->hash,
GUINT_TO_POINTER (keyval),
targets);
return gtk_widget_mnemonic_activate (chosen_widget, overloaded);
}
return FALSE;
}
GSList *
_gtk_mnemonic_hash_lookup (GtkMnemonicHash *mnemonic_hash,
guint keyval)
{
return g_hash_table_lookup (mnemonic_hash->hash, GUINT_TO_POINTER (keyval));
}
static void
mnemonic_hash_foreach_func (gpointer key,
gpointer value,
gpointer data)
{
struct {
GtkMnemonicHashForeach func;
gpointer func_data;
} *info = data;
guint keyval = GPOINTER_TO_UINT (key);
GSList *targets = value;
(*info->func) (keyval, targets, info->func_data);
}
void
_gtk_mnemonic_hash_foreach (GtkMnemonicHash *mnemonic_hash,
GtkMnemonicHashForeach func,
gpointer func_data)
{
struct {
GtkMnemonicHashForeach func;
gpointer func_data;
} info;
info.func = func;
info.func_data = func_data;
g_hash_table_foreach (mnemonic_hash->hash,
mnemonic_hash_foreach_func,
&info);
}
-52
View File
@@ -1,52 +0,0 @@
/* gtkmnemonichash.h: Sets of mnemonics with cycling
*
* GTK - The GIMP Toolkit
* Copyright (C) 2002, Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GTK_MNEMONIC_HASH_H__
#define __GTK_MNEMONIC_HASH_H__
#include <gdk/gdk.h>
#include <gtk/gtkwidget.h>
G_BEGIN_DECLS
typedef struct _GtkMnemnonicHash GtkMnemonicHash;
typedef void (*GtkMnemonicHashForeach) (guint keyval,
GSList *targets,
gpointer data);
GtkMnemonicHash *_gtk_mnemonic_hash_new (void);
void _gtk_mnemonic_hash_free (GtkMnemonicHash *mnemonic_hash);
void _gtk_mnemonic_hash_add (GtkMnemonicHash *mnemonic_hash,
guint keyval,
GtkWidget *target);
void _gtk_mnemonic_hash_remove (GtkMnemonicHash *mnemonic_hash,
guint keyval,
GtkWidget *target);
gboolean _gtk_mnemonic_hash_activate (GtkMnemonicHash *mnemonic_hash,
guint keyval);
GSList * _gtk_mnemonic_hash_lookup (GtkMnemonicHash *mnemonic_hash,
guint keyval);
void _gtk_mnemonic_hash_foreach (GtkMnemonicHash *mnemonic_hash,
GtkMnemonicHashForeach func,
gpointer func_data);
G_END_DECLS
#endif /* __GTK_MNEMONIC_HASH_H__ */
+1 -53
View File
@@ -39,7 +39,6 @@
#include "gtkcontainerprivate.h"
#include "gtkiconprivate.h"
#include "gtksizegroup.h"
#include "gtkaccellabelprivate.h"
#include "gtkactionable.h"
#include "gtkeventcontrollermotion.h"
#include "gtkeventcontrollerkey.h"
@@ -525,19 +524,7 @@ update_accel (GtkModelButton *button,
{
if (accel)
{
guint key;
GdkModifierType mods;
GtkAccelLabelClass *accel_class;
char *str;
gtk_accelerator_parse (accel, &key, &mods);
accel_class = g_type_class_ref (GTK_TYPE_ACCEL_LABEL);
str = _gtk_accel_label_class_get_accelerator_label (accel_class, key, mods);
gtk_label_set_label (GTK_LABEL (button->accel_label), str);
g_free (str);
g_type_class_unref (accel_class);
gtk_label_set_label (GTK_LABEL (button->accel_label), accel);
gtk_widget_show (button->accel_label);
}
else
@@ -919,44 +906,6 @@ gtk_model_button_finalize (GObject *object)
G_OBJECT_CLASS (gtk_model_button_parent_class)->finalize (object);
}
static void
gtk_model_button_map (GtkWidget *widget)
{
GtkModelButton *button = GTK_MODEL_BUTTON (widget);
GtkWindow *window;
GtkApplication *app;
const char *action_name;
GVariant *action_target;
GTK_WIDGET_CLASS (gtk_model_button_parent_class)->map (widget);
if (button->accel)
return;
window = GTK_WINDOW (gtk_widget_get_root (widget));
app = gtk_window_get_application (window);
if (!app)
return;
action_name = gtk_actionable_get_action_name (GTK_ACTIONABLE (widget));
action_target = gtk_actionable_get_action_target_value (GTK_ACTIONABLE (widget));
if (action_name)
{
char *detailed;
char **accels;
detailed = g_action_print_detailed_name (action_name, action_target);
accels = gtk_application_get_accels_for_action (app, detailed);
update_accel (button, accels[0]);
g_strfreev (accels);
g_free (detailed);
}
}
static gboolean
gtk_model_button_focus (GtkWidget *widget,
GtkDirectionType direction)
@@ -1003,7 +952,6 @@ gtk_model_button_class_init (GtkModelButtonClass *class)
widget_class->measure = gtk_model_button_measure;
widget_class->size_allocate = gtk_model_button_size_allocate;
widget_class->destroy = gtk_model_button_destroy;
widget_class->map = gtk_model_button_map;
widget_class->state_flags_changed = gtk_model_button_state_flags_changed;
widget_class->direction_changed = gtk_model_button_direction_changed;
widget_class->focus = gtk_model_button_focus;
+4 -3
View File
@@ -310,9 +310,10 @@ gtk_model_menu_item_set_accel (GtkModelMenuItem *item,
if (accel)
{
gtk_accelerator_parse (accel, &key, &modifiers);
if (!key)
modifiers = 0;
if (!gtk_accelerator_parse (accel, &key, &modifiers))
{
g_warning ("\"%s\" is not a valida accelerator, ignoring", accel);
}
}
else
{
+18 -3
View File
@@ -53,6 +53,10 @@
#include "gtkstylecontextprivate.h"
#include "gtkdialogprivate.h"
#include "gtkgestureclick.h"
#include "gtkshortcutcontroller.h"
#include "gtkshortcuttrigger.h"
#include "gtkshortcutaction.h"
#include "gtkshortcut.h"
#include <glib/gprintf.h>
@@ -1335,6 +1339,7 @@ do_popup_menu_for_process_tree_view (GtkWidget *widget,
static gboolean
on_popup_menu_for_process_tree_view (GtkWidget *widget,
GVariant *args,
gpointer user_data)
{
GtkMountOperation *op = GTK_MOUNT_OPERATION (user_data);
@@ -1380,6 +1385,10 @@ create_show_processes_dialog (GtkMountOperation *op,
gchar *s;
gboolean use_header;
GtkGesture *gesture;
GtkEventController *controller;
GtkShortcutTrigger *trigger;
GtkShortcutAction *action;
GtkShortcut *shortcut;
priv = op->priv;
@@ -1466,9 +1475,15 @@ create_show_processes_dialog (GtkMountOperation *op,
gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
gtk_container_add (GTK_CONTAINER (vbox), scrolled_window);
g_signal_connect (tree_view, "popup-menu",
G_CALLBACK (on_popup_menu_for_process_tree_view),
op);
controller = gtk_shortcut_controller_new ();
trigger = gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_F10, GDK_SHIFT_MASK),
gtk_keyval_trigger_new (GDK_KEY_Menu, 0));
action = gtk_callback_action_new (on_popup_menu_for_process_tree_view, op, NULL);
shortcut = gtk_shortcut_new (trigger, action);
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
shortcut);
g_object_unref (shortcut);
gtk_widget_add_controller (tree_view, controller);
gesture = gtk_gesture_click_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
+97 -84
View File
@@ -27,7 +27,6 @@
#include "gtknotebook.h"
#include "gtkbindings.h"
#include "gtkbox.h"
#include "gtkbuildable.h"
#include "gtkbutton.h"
@@ -693,7 +692,9 @@ static void gtk_notebook_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline);
static gboolean gtk_notebook_popup_menu (GtkWidget *widget);
static gboolean gtk_notebook_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer user_data);
static void gtk_notebook_motion (GtkEventController *controller,
double x,
double y,
@@ -864,49 +865,53 @@ G_DEFINE_TYPE_WITH_CODE (GtkNotebook, gtk_notebook, GTK_TYPE_CONTAINER,
gtk_notebook_buildable_init))
static void
add_tab_bindings (GtkBindingSet *binding_set,
add_tab_bindings (GtkWidgetClass *widget_class,
GdkModifierType modifiers,
GtkDirectionType direction)
{
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
"move_focus_out", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
"move_focus_out", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Tab, modifiers,
"move_focus_out",
"(i)", direction);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Tab, modifiers,
"move_focus_out",
"(i)", direction);
}
static void
add_arrow_bindings (GtkBindingSet *binding_set,
add_arrow_bindings (GtkWidgetClass *widget_class,
guint keysym,
GtkDirectionType direction)
{
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
"move_focus_out", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_CONTROL_MASK,
"move_focus_out", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_widget_class_add_binding_signal (widget_class,
keysym, GDK_CONTROL_MASK,
"move_focus_out",
"(i)", direction);
gtk_widget_class_add_binding_signal (widget_class,
keypad_keysym, GDK_CONTROL_MASK,
"move_focus_out",
"(i)", direction);
}
static void
add_reorder_bindings (GtkBindingSet *binding_set,
add_reorder_bindings (GtkWidgetClass *widget_class,
guint keysym,
GtkDirectionType direction,
gboolean move_to_last)
{
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
gtk_binding_entry_add_signal (binding_set, keysym, GDK_MOD1_MASK,
"reorder_tab", 2,
GTK_TYPE_DIRECTION_TYPE, direction,
G_TYPE_BOOLEAN, move_to_last);
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_MOD1_MASK,
"reorder_tab", 2,
GTK_TYPE_DIRECTION_TYPE, direction,
G_TYPE_BOOLEAN, move_to_last);
gtk_widget_class_add_binding_signal (widget_class,
keysym, GDK_MOD1_MASK,
"reorder_tab",
"(ib)", direction, move_to_last);
gtk_widget_class_add_binding_signal (widget_class,
keypad_keysym, GDK_MOD1_MASK,
"reorder_tab",
"(ib)", direction, move_to_last);
}
static gboolean
@@ -964,7 +969,6 @@ gtk_notebook_class_init (GtkNotebookClass *class)
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
GtkBindingSet *binding_set;
gobject_class->set_property = gtk_notebook_set_property;
gobject_class->get_property = gtk_notebook_get_property;
@@ -975,7 +979,6 @@ gtk_notebook_class_init (GtkNotebookClass *class)
widget_class->unmap = gtk_notebook_unmap;
widget_class->measure = gtk_notebook_measure;
widget_class->size_allocate = gtk_notebook_size_allocate;
widget_class->popup_menu = gtk_notebook_popup_menu;
widget_class->grab_notify = gtk_notebook_grab_notify;
widget_class->state_flags_changed = gtk_notebook_state_flags_changed;
widget_class->focus = gtk_notebook_focus;
@@ -1246,67 +1249,74 @@ gtk_notebook_class_init (GtkNotebookClass *class)
G_TYPE_FROM_CLASS (gobject_class),
_gtk_marshal_OBJECT__OBJECTv);
binding_set = gtk_binding_set_by_class (class);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_space, 0,
"select-page", 1,
G_TYPE_BOOLEAN, FALSE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Space, 0,
"select-page", 1,
G_TYPE_BOOLEAN, FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, 0,
"select-page",
"(b)", FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, 0,
"select-page",
"(b)", FALSE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Home, 0,
"focus-tab", 1,
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_FIRST);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Home, 0,
"focus-tab", 1,
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_FIRST);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_End, 0,
"focus-tab", 1,
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_LAST);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_End, 0,
"focus-tab", 1,
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_LAST);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Home, 0,
"focus-tab",
"(i)", GTK_NOTEBOOK_TAB_FIRST);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Home, 0,
"focus-tab",
"(i)", GTK_NOTEBOOK_TAB_FIRST);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_End, 0,
"focus-tab",
"(i)", GTK_NOTEBOOK_TAB_LAST);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_End, 0,
"focus-tab",
"(i)", GTK_NOTEBOOK_TAB_LAST);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Page_Up, GDK_CONTROL_MASK,
"change-current-page", 1,
G_TYPE_INT, -1);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Page_Down, GDK_CONTROL_MASK,
"change-current-page", 1,
G_TYPE_INT, 1);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Up, GDK_CONTROL_MASK,
"change-current-page",
"(i)", -1);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Down, GDK_CONTROL_MASK,
"change-current-page",
"(i)", 1);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Page_Up, GDK_CONTROL_MASK | GDK_MOD1_MASK,
"change-current-page", 1,
G_TYPE_INT, -1);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Page_Down, GDK_CONTROL_MASK | GDK_MOD1_MASK,
"change-current-page", 1,
G_TYPE_INT, 1);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Up, GDK_CONTROL_MASK | GDK_MOD1_MASK,
"change-current-page",
"(i)", -1);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Page_Down, GDK_CONTROL_MASK | GDK_MOD1_MASK,
"change-current-page",
"(i)", 1);
add_arrow_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP);
add_arrow_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN);
add_arrow_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT);
add_arrow_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT);
add_arrow_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP);
add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);
add_reorder_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP, FALSE);
add_reorder_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN, FALSE);
add_reorder_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT, FALSE);
add_reorder_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT, FALSE);
add_reorder_bindings (binding_set, GDK_KEY_Home, GTK_DIR_LEFT, TRUE);
add_reorder_bindings (binding_set, GDK_KEY_Home, GTK_DIR_UP, TRUE);
add_reorder_bindings (binding_set, GDK_KEY_End, GTK_DIR_RIGHT, TRUE);
add_reorder_bindings (binding_set, GDK_KEY_End, GTK_DIR_DOWN, TRUE);
add_reorder_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP, FALSE);
add_reorder_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN, FALSE);
add_reorder_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT, FALSE);
add_reorder_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT, FALSE);
add_reorder_bindings (widget_class, GDK_KEY_Home, GTK_DIR_LEFT, TRUE);
add_reorder_bindings (widget_class, GDK_KEY_Home, GTK_DIR_UP, TRUE);
add_reorder_bindings (widget_class, GDK_KEY_End, GTK_DIR_RIGHT, TRUE);
add_reorder_bindings (widget_class, GDK_KEY_End, GTK_DIR_DOWN, TRUE);
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
/* Context menu */
gtk_widget_class_add_binding (widget_class,
GDK_KEY_F10, GDK_SHIFT_MASK,
gtk_notebook_popup_menu, NULL);
gtk_widget_class_add_binding (widget_class,
GDK_KEY_Menu, 0,
gtk_notebook_popup_menu, NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_NOTEBOOK_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("notebook"));
@@ -1622,7 +1632,8 @@ gtk_notebook_move_focus_out (GtkNotebook *notebook,
g_object_ref (notebook);
priv->focus_out = TRUE;
g_signal_emit_by_name (toplevel, "move-focus", direction_type);
gtk_widget_activate_action (GTK_WIDGET (notebook), "focus.move",
"i", direction_type);
priv->focus_out = FALSE;
g_object_unref (notebook);
@@ -2595,7 +2606,9 @@ gtk_notebook_gesture_pressed (GtkGestureClick *gesture,
static gboolean
gtk_notebook_popup_menu (GtkWidget *widget)
gtk_notebook_popup_menu (GtkWidget *widget,
GVariant *args,
gpointer data)
{
GtkNotebook *notebook = GTK_NOTEBOOK (widget);
GtkNotebookPrivate *priv = notebook->priv;
+92 -92
View File
@@ -26,7 +26,6 @@
#include "gtkpaned.h"
#include "gtkbindings.h"
#include "gtkcontainerprivate.h"
#include "gtkcssnodeprivate.h"
#include "gtkcssstylepropertyprivate.h"
@@ -276,24 +275,29 @@ static guint signals[LAST_SIGNAL] = { 0 };
static GParamSpec *paned_props[LAST_PROP] = { NULL, };
static void
add_tab_bindings (GtkBindingSet *binding_set,
GdkModifierType modifiers)
add_tab_bindings (GtkWidgetClass *widget_class,
GdkModifierType modifiers)
{
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
"toggle-handle-focus", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
"toggle-handle-focus", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Tab, modifiers,
"toggle-handle-focus",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Tab, modifiers,
"toggle-handle-focus",
NULL);
}
static void
add_move_binding (GtkBindingSet *binding_set,
add_move_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType mask,
GtkScrollType scroll)
{
gtk_binding_entry_add_signal (binding_set, keyval, mask,
"move-handle", 1,
GTK_TYPE_SCROLL_TYPE, scroll);
gtk_widget_class_add_binding_signal (widget_class,
keyval, mask,
"move-handle",
"(i)", scroll);
}
static void
@@ -335,16 +339,9 @@ gtk_paned_handle_contains (GtkGizmo *handle,
static void
gtk_paned_class_init (GtkPanedClass *class)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
GtkPanedClass *paned_class;
GtkBindingSet *binding_set;
object_class = (GObjectClass *) class;
widget_class = (GtkWidgetClass *) class;
container_class = (GtkContainerClass *) class;
paned_class = (GtkPanedClass *) class;
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
object_class->set_property = gtk_paned_set_property;
object_class->get_property = gtk_paned_get_property;
@@ -361,12 +358,12 @@ gtk_paned_class_init (GtkPanedClass *class)
container_class->child_type = gtk_paned_child_type;
container_class->set_focus_child = gtk_paned_set_focus_child;
paned_class->cycle_child_focus = gtk_paned_cycle_child_focus;
paned_class->toggle_handle_focus = gtk_paned_toggle_handle_focus;
paned_class->move_handle = gtk_paned_move_handle;
paned_class->cycle_handle_focus = gtk_paned_cycle_handle_focus;
paned_class->accept_position = gtk_paned_accept_position;
paned_class->cancel_position = gtk_paned_cancel_position;
class->cycle_child_focus = gtk_paned_cycle_child_focus;
class->toggle_handle_focus = gtk_paned_toggle_handle_focus;
class->move_handle = gtk_paned_move_handle;
class->cycle_handle_focus = gtk_paned_cycle_handle_focus;
class->accept_position = gtk_paned_accept_position;
class->cancel_position = gtk_paned_cancel_position;
paned_props[PROP_POSITION] =
@@ -604,84 +601,87 @@ gtk_paned_class_init (GtkPanedClass *class)
_gtk_marshal_BOOLEAN__VOID,
G_TYPE_BOOLEAN, 0);
binding_set = gtk_binding_set_by_class (class);
/* F6 and friends */
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_F6, 0,
"cycle-child-focus", 1,
G_TYPE_BOOLEAN, FALSE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_F6, GDK_SHIFT_MASK,
"cycle-child-focus", 1,
G_TYPE_BOOLEAN, TRUE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_F6, 0,
"cycle-child-focus",
"(b)", FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_F6, GDK_SHIFT_MASK,
"cycle-child-focus",
"(b)", TRUE);
/* F8 and friends */
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_F8, 0,
"cycle-handle-focus", 1,
G_TYPE_BOOLEAN, FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_F8, 0,
"cycle-handle-focus",
"(b)", FALSE);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_F8, GDK_SHIFT_MASK,
"cycle-handle-focus",
"(b)", TRUE);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_F8, GDK_SHIFT_MASK,
"cycle-handle-focus", 1,
G_TYPE_BOOLEAN, TRUE);
add_tab_bindings (binding_set, 0);
add_tab_bindings (binding_set, GDK_CONTROL_MASK);
add_tab_bindings (binding_set, GDK_SHIFT_MASK);
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
add_tab_bindings (widget_class, 0);
add_tab_bindings (widget_class, GDK_CONTROL_MASK);
add_tab_bindings (widget_class, GDK_SHIFT_MASK);
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
/* accept and cancel positions */
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Escape, 0,
"cancel-position", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"cancel-position",
NULL);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_Return, 0,
"accept-position", 0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_ISO_Enter, 0,
"accept-position", 0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Enter, 0,
"accept-position", 0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_space, 0,
"accept-position", 0);
gtk_binding_entry_add_signal (binding_set,
GDK_KEY_KP_Space, 0,
"accept-position", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Return, 0,
"accept-position",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_ISO_Enter, 0,
"accept-position",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Enter, 0,
"accept-position",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, 0,
"accept-position",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, 0,
"accept-position",
NULL);
/* move handle */
add_move_binding (binding_set, GDK_KEY_Left, 0, GTK_SCROLL_STEP_LEFT);
add_move_binding (binding_set, GDK_KEY_KP_Left, 0, GTK_SCROLL_STEP_LEFT);
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
add_move_binding (widget_class, GDK_KEY_Left, 0, GTK_SCROLL_STEP_LEFT);
add_move_binding (widget_class, GDK_KEY_KP_Left, 0, GTK_SCROLL_STEP_LEFT);
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
add_move_binding (widget_class, GDK_KEY_KP_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
add_move_binding (binding_set, GDK_KEY_Right, 0, GTK_SCROLL_STEP_RIGHT);
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (binding_set, GDK_KEY_KP_Right, 0, GTK_SCROLL_STEP_RIGHT);
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (widget_class, GDK_KEY_Right, 0, GTK_SCROLL_STEP_RIGHT);
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (widget_class, GDK_KEY_KP_Right, 0, GTK_SCROLL_STEP_RIGHT);
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (binding_set, GDK_KEY_Up, 0, GTK_SCROLL_STEP_UP);
add_move_binding (binding_set, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
add_move_binding (binding_set, GDK_KEY_KP_Up, 0, GTK_SCROLL_STEP_UP);
add_move_binding (binding_set, GDK_KEY_KP_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
add_move_binding (binding_set, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_UP);
add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0, GTK_SCROLL_PAGE_UP);
add_move_binding (widget_class, GDK_KEY_Up, 0, GTK_SCROLL_STEP_UP);
add_move_binding (widget_class, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
add_move_binding (widget_class, GDK_KEY_KP_Up, 0, GTK_SCROLL_STEP_UP);
add_move_binding (widget_class, GDK_KEY_KP_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
add_move_binding (widget_class, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_UP);
add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0, GTK_SCROLL_PAGE_UP);
add_move_binding (binding_set, GDK_KEY_Down, 0, GTK_SCROLL_STEP_DOWN);
add_move_binding (binding_set, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
add_move_binding (binding_set, GDK_KEY_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
add_move_binding (binding_set, GDK_KEY_KP_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
add_move_binding (binding_set, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (widget_class, GDK_KEY_Down, 0, GTK_SCROLL_STEP_DOWN);
add_move_binding (widget_class, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
add_move_binding (widget_class, GDK_KEY_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
add_move_binding (widget_class, GDK_KEY_KP_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
add_move_binding (widget_class, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
add_move_binding (binding_set, GDK_KEY_Home, 0, GTK_SCROLL_START);
add_move_binding (binding_set, GDK_KEY_KP_Home, 0, GTK_SCROLL_START);
add_move_binding (binding_set, GDK_KEY_End, 0, GTK_SCROLL_END);
add_move_binding (binding_set, GDK_KEY_KP_End, 0, GTK_SCROLL_END);
add_move_binding (widget_class, GDK_KEY_Home, 0, GTK_SCROLL_START);
add_move_binding (widget_class, GDK_KEY_KP_Home, 0, GTK_SCROLL_START);
add_move_binding (widget_class, GDK_KEY_End, 0, GTK_SCROLL_END);
add_move_binding (widget_class, GDK_KEY_KP_End, 0, GTK_SCROLL_END);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_PANED_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("paned"));
+45 -5
View File
@@ -23,7 +23,6 @@
#include "gtkpasswordentry.h"
#include "gtkaccessible.h"
#include "gtkbindings.h"
#include "gtktextprivate.h"
#include "gtkeditable.h"
#include "gtkgestureclick.h"
@@ -59,6 +58,7 @@ typedef struct {
GtkWidget *peek_icon;
GdkKeymap *keymap;
GMenuModel *extra_menu;
gboolean activates_default;
} GtkPasswordEntryPrivate;
struct _GtkPasswordEntryClass
@@ -66,6 +66,11 @@ struct _GtkPasswordEntryClass
GtkWidgetClass parent_class;
};
enum {
ACTIVATE,
LAST_SIGNAL
};
enum {
PROP_PLACEHOLDER_TEXT = 1,
PROP_ACTIVATES_DEFAULT,
@@ -76,12 +81,28 @@ enum {
static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
static guint signals[LAST_SIGNAL] = { 0 };
static void gtk_password_entry_editable_init (GtkEditableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (GtkPasswordEntry, gtk_password_entry, GTK_TYPE_WIDGET,
G_ADD_PRIVATE (GtkPasswordEntry)
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, gtk_password_entry_editable_init))
static void
gtk_password_entry_activate (GtkWidget *widget,
const char *action_name,
GVariant *parameters)
{
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
if (priv->activates_default)
gtk_widget_activate_default (widget);
else
g_signal_emit (entry, signals[ACTIVATE], 0);
}
static void
keymap_state_changed (GdkKeymap *keymap,
GtkWidget *widget)
@@ -217,9 +238,9 @@ gtk_password_entry_set_property (GObject *object,
break;
case PROP_ACTIVATES_DEFAULT:
if (gtk_text_get_activates_default (GTK_TEXT (priv->entry)) != g_value_get_boolean (value))
if (priv->activates_default != g_value_get_boolean (value))
{
gtk_text_set_activates_default (GTK_TEXT (priv->entry), g_value_get_boolean (value));
priv->activates_default = g_value_get_boolean (value);
g_object_notify_by_pspec (object, pspec);
}
break;
@@ -257,7 +278,7 @@ gtk_password_entry_get_property (GObject *object,
break;
case PROP_ACTIVATES_DEFAULT:
g_value_set_boolean (value, gtk_text_get_activates_default (GTK_TEXT (priv->entry)));
g_value_set_boolean (value, priv->activates_default);
break;
case PROP_SHOW_PEEK_ICON:
@@ -427,6 +448,25 @@ gtk_password_entry_class_init (GtkPasswordEntryClass *klass)
g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
gtk_editable_install_properties (object_class, NUM_PROPERTIES);
signals[ACTIVATE] =
g_signal_new (I_("activate"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
gtk_widget_class_install_action (widget_class, "activate", NULL,
gtk_password_entry_activate);
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
"activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
"activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
"activate", NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("entry"));
}
@@ -579,7 +619,7 @@ gtk_password_entry_set_extra_menu (GtkPasswordEntry *entry,
/**
* gtk_password_entry_get_extra_menu:
* @self: a #GtkText
* @entry: a #GtkText
*
* Gets the menu model set with gtk_password_entry_set_extra_menu().
*
+2 -7
View File
@@ -104,8 +104,6 @@ static void mount_volume (GtkPlacesView
static void on_eject_button_clicked (GtkWidget *widget,
GtkPlacesViewRow *row);
static gboolean on_row_popup_menu (GtkPlacesViewRow *row);
static void populate_servers (GtkPlacesView *view);
static gboolean gtk_places_view_get_fetching_networks (GtkPlacesView *view);
@@ -666,8 +664,6 @@ insert_row (GtkPlacesView *view,
g_object_set_data (G_OBJECT (row), "is-network", GINT_TO_POINTER (is_network));
g_signal_connect (row, "popup-menu", G_CALLBACK (on_row_popup_menu), row);
g_signal_connect (gtk_places_view_row_get_eject_button (GTK_PLACES_VIEW_ROW (row)),
"clicked",
G_CALLBACK (on_eject_button_clicked),
@@ -1733,11 +1729,10 @@ popup_menu (GtkPlacesViewRow *row,
gtk_menu_popup_at_pointer (GTK_MENU (priv->popup_menu), (GdkEvent *) event);
}
static gboolean
on_row_popup_menu (GtkPlacesViewRow *row)
void
gtk_places_view_row_popup_menu (GtkPlacesViewRow *row)
{
popup_menu (row, NULL);
return TRUE;
}
static gboolean
+2
View File
@@ -81,6 +81,8 @@ gboolean gtk_places_view_get_loading (GtkPlacesView
GtkWidget * gtk_places_view_new (void);
G_END_DECLS
#endif /* GTK_PLACES_VIEW_H */
+1 -1
View File
@@ -200,7 +200,7 @@ pressed_cb (GtkGesture *gesture,
double y,
GtkPlacesViewRow *row)
{
g_signal_emit_by_name (row, "popup-menu", 0);
gtk_places_view_row_popup_menu (row);
}
static void
+1
View File
@@ -57,6 +57,7 @@ void gtk_places_view_row_set_path_size_group (GtkPlacesViewR
void gtk_places_view_row_set_space_size_group (GtkPlacesViewRow *row,
GtkSizeGroup *group);
void gtk_places_view_row_popup_menu (GtkPlacesViewRow *row);
G_END_DECLS
+6 -49
View File
@@ -111,10 +111,8 @@
#include "gtkwidgetprivate.h"
#include "gtkeventcontrollerkey.h"
#include "gtkcssnodeprivate.h"
#include "gtkbindings.h"
#include "gtkenums.h"
#include "gtktypebuiltins.h"
#include "gtkmnemonichash.h"
#include "gtkgizmoprivate.h"
#include "gtkintl.h"
#include "gtkprivate.h"
@@ -488,8 +486,11 @@ allocate_contents (GtkGizmo *gizmo,
}
static void
gtk_popover_activate_default (GtkPopover *popover)
gtk_popover_activate_default_activate (GtkWidget *widget,
const char *action_name,
GVariant *parameter)
{
GtkPopover *popover = GTK_POPOVER (widget);
GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
GtkWidget *focus_widget;
@@ -505,31 +506,6 @@ gtk_popover_activate_default (GtkPopover *popover)
gtk_widget_activate (focus_widget);
}
static void
activate_default_cb (GSimpleAction *action,
GVariant *parameter,
gpointer data)
{
gtk_popover_activate_default (GTK_POPOVER (data));
}
static void
add_actions (GtkPopover *popover)
{
GActionEntry entries[] = {
{ "activate", activate_default_cb, NULL, NULL, NULL },
};
GActionGroup *actions;
actions = G_ACTION_GROUP (g_simple_action_group_new ());
g_action_map_add_action_entries (G_ACTION_MAP (actions),
entries, G_N_ELEMENTS (entries),
popover);
gtk_widget_insert_action_group (GTK_WIDGET (popover), "default", actions);
g_object_unref (actions);
}
static void
node_style_changed_cb (GtkCssNode *node,
GtkCssStyleChange *change,
@@ -581,8 +557,6 @@ gtk_popover_init (GtkPopover *popover)
context = gtk_widget_get_style_context (GTK_WIDGET (popover));
gtk_style_context_add_class (context, GTK_STYLE_CLASS_BACKGROUND);
add_actions (popover);
}
static void
@@ -635,13 +609,6 @@ gtk_popover_unrealize (GtkWidget *widget)
g_clear_object (&priv->surface);
}
static void
gtk_popover_move_focus (GtkWidget *widget,
GtkDirectionType direction)
{
g_signal_emit_by_name (gtk_widget_get_root (widget), "move-focus", direction);
}
static void
gtk_popover_show (GtkWidget *widget)
{
@@ -1325,13 +1292,10 @@ gtk_popover_class_init (GtkPopoverClass *klass)
widget_class->measure = gtk_popover_measure;
widget_class->size_allocate = gtk_popover_size_allocate;
widget_class->snapshot = gtk_popover_snapshot;
widget_class->move_focus = gtk_popover_move_focus;
container_class->add = gtk_popover_add;
container_class->remove = gtk_popover_remove;
klass->activate_default = gtk_popover_activate_default;
properties[PROP_RELATIVE_TO] =
g_param_spec_object ("relative-to",
P_("Relative to"),
@@ -1386,15 +1350,8 @@ gtk_popover_class_init (GtkPopoverClass *klass)
G_TYPE_NONE,
0);
signals[ACTIVATE_DEFAULT] =
g_signal_new (I_("activate-default"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkPopoverClass, activate_default),
NULL, NULL,
NULL,
G_TYPE_NONE,
0);
gtk_widget_class_install_action (widget_class, "default.activate", NULL,
gtk_popover_activate_default_activate);
gtk_widget_class_set_css_name (widget_class, "popover");
}
+85 -44
View File
@@ -31,7 +31,11 @@
#include "gtkeventcontrollerkey.h"
#include "gtkmain.h"
#include "gtktypebuiltins.h"
#include "gtkbindings.h"
#include "gtkshortcut.h"
#include "gtkshortcutcontroller.h"
#include "gtkshortcuttrigger.h"
#include "gtkshortcutmanager.h"
#include "gtklabelprivate.h"
/**
@@ -135,7 +139,15 @@ enum {
PROP_VISIBLE_SUBMENU = 1
};
G_DEFINE_TYPE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER)
static void
gtk_popover_menu_shortcut_manager_interface_init (GtkShortcutManagerInterface *iface)
{
}
G_DEFINE_TYPE_WITH_CODE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER,
G_IMPLEMENT_INTERFACE (GTK_TYPE_SHORTCUT_MANAGER,
gtk_popover_menu_shortcut_manager_interface_init))
void
gtk_popover_menu_set_active_item (GtkPopoverMenu *menu,
@@ -178,12 +190,24 @@ focus_out (GtkEventController *controller,
gtk_popover_popdown (popover);
}
static gboolean
key_pressed (GtkEventController *controller,
guint keyval,
guint keycode,
GdkModifierType state,
GtkWidget *widget)
{
_gtk_label_mnemonics_visible_apply_recursively (widget, TRUE);
return FALSE;
}
static void
gtk_popover_menu_init (GtkPopoverMenu *popover)
{
GtkWidget *stack;
GtkStyleContext *style_context;
GtkEventController *controller;
GList *controllers, *l;
stack = gtk_stack_new ();
gtk_stack_set_vhomogeneous (GTK_STACK (stack), FALSE);
@@ -197,8 +221,23 @@ gtk_popover_menu_init (GtkPopoverMenu *popover)
gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_MENU);
controller = gtk_event_controller_key_new ();
gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
g_signal_connect (controller, "key-pressed", G_CALLBACK (key_pressed), popover);
gtk_widget_add_controller (GTK_WIDGET (popover), controller);
controller = gtk_event_controller_key_new ();
gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_BUBBLE);
g_signal_connect (controller, "focus-out", G_CALLBACK (focus_out), popover);
gtk_widget_add_controller (GTK_WIDGET (popover), controller);
/* Trigger mnemonics without Alt */
controllers = _gtk_widget_list_controllers (GTK_WIDGET (popover), GTK_PHASE_CAPTURE);
for (l = controllers; l; l = l->next)
{
if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
gtk_shortcut_controller_set_mnemonics_modifiers (l->data, 0);
}
g_list_free (controllers);
}
static void
@@ -213,6 +252,7 @@ gtk_popover_menu_unmap (GtkWidget *widget)
{
gtk_popover_menu_open_submenu (GTK_POPOVER_MENU (widget), "main");
GTK_WIDGET_CLASS (gtk_popover_menu_parent_class)->unmap (widget);
_gtk_label_mnemonics_visible_apply_recursively (widget, FALSE);
}
static void
@@ -334,37 +374,41 @@ gtk_popover_menu_focus (GtkWidget *widget,
static void
add_tab_bindings (GtkBindingSet *binding_set,
add_tab_bindings (GtkWidgetClass *widget_class,
GdkModifierType modifiers,
GtkDirectionType direction)
{
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
"move-focus", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
"move-focus", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
GtkShortcut *shortcut;
shortcut = gtk_shortcut_new_with_arguments (
gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_Tab, modifiers),
gtk_keyval_trigger_new (GDK_KEY_KP_Tab, modifiers)),
gtk_action_action_new ("focus.move"),
"i", direction);
gtk_widget_class_add_shortcut (widget_class, shortcut);
g_object_unref (shortcut);
}
static void
add_arrow_bindings (GtkBindingSet *binding_set,
add_arrow_bindings (GtkWidgetClass *widget_class,
guint keysym,
GtkDirectionType direction)
{
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
gtk_binding_entry_add_signal (binding_set, keysym, 0,
"move-focus", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
"move-focus", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, keypad_keysym, 0,
"move-focus", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_CONTROL_MASK,
"move-focus", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_widget_class_bind_action (widget_class, keysym, 0,
"focus.move", "i",
direction);
gtk_widget_class_bind_action (widget_class, keysym, GDK_CONTROL_MASK,
"focus.move", "i",
direction);
gtk_widget_class_bind_action (widget_class, keypad_keysym, 0,
"focus.move", "i",
direction);
gtk_widget_class_bind_action (widget_class, keypad_keysym, GDK_CONTROL_MASK,
"focus.move", "i",
direction);
}
static void
@@ -373,7 +417,6 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass)
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkBindingSet *binding_set;
object_class->set_property = gtk_popover_menu_set_property;
object_class->get_property = gtk_popover_menu_get_property;
@@ -393,28 +436,26 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
binding_set = gtk_binding_set_by_class (klass);
add_arrow_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP);
add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);
add_arrow_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP);
add_arrow_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN);
add_arrow_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT);
add_arrow_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT);
add_tab_bindings (widget_class, 0, GTK_DIR_TAB_FORWARD);
add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
add_tab_bindings (widget_class, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
add_tab_bindings (binding_set, 0, GTK_DIR_TAB_FORWARD);
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
add_tab_bindings (binding_set, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
"activate-default", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
"activate-default", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
"activate-default", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0,
"activate-default", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0,
"activate-default", 0);
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
"default.activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
"default.activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
"default.activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_space, 0,
"default.activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Space, 0,
"default.activate", NULL);
}
/**
+4 -1
View File
@@ -27,6 +27,8 @@
#include "gtkprivate.h"
#include "gtkintl.h"
#include "gtkshortcutmanager.h"
/**
* SECTION:gtkroot
* @Title: GtkRoot
@@ -42,7 +44,8 @@
*/
G_DEFINE_INTERFACE_WITH_CODE (GtkRoot, gtk_root, GTK_TYPE_WIDGET,
g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_NATIVE))
g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_NATIVE);
g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_SHORTCUT_MANAGER));
static GdkDisplay *
gtk_root_default_get_display (GtkRoot *self)
+5 -8
View File
@@ -28,7 +28,6 @@
#include "gtkscale.h"
#include "gtkadjustment.h"
#include "gtkbindings.h"
#include "gtkbuildable.h"
#include "gtkbuilderprivate.h"
#include "gtkgizmoprivate.h"
@@ -621,10 +620,11 @@ gtk_scale_size_allocate (GtkWidget *widget,
}
}
#define add_slider_binding(binding_set, keyval, mask, scroll) \
gtk_binding_entry_add_signal (binding_set, keyval, mask, \
I_("move-slider"), 1, \
GTK_TYPE_SCROLL_TYPE, scroll)
#define add_slider_binding(binding_set, keyval, mask, scroll) \
gtk_widget_class_add_binding_signal (widget_class, \
keyval, mask, \
I_("move-slider"), \
"(i)", scroll)
static void
gtk_scale_value_changed (GtkRange *range)
@@ -648,7 +648,6 @@ gtk_scale_class_init (GtkScaleClass *class)
GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
GtkRangeClass *range_class;
GtkBindingSet *binding_set;
gobject_class = G_OBJECT_CLASS (class);
range_class = (GtkRangeClass*) class;
@@ -741,8 +740,6 @@ gtk_scale_class_init (GtkScaleClass *class)
* blind users etc. don't care about scale orientation.
*/
binding_set = gtk_binding_set_by_class (class);
add_slider_binding (binding_set, GDK_KEY_Left, 0,
GTK_SCROLL_STEP_LEFT);
+24 -16
View File
@@ -37,7 +37,6 @@
#include "gtkscalebutton.h"
#include "gtkadjustment.h"
#include "gtkbindings.h"
#include "gtkbox.h"
#include "gtkbuttonprivate.h"
#include "gtkimage.h"
@@ -171,7 +170,6 @@ gtk_scale_button_class_init (GtkScaleButtonClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
GtkBindingSet *binding_set;
gobject_class->constructed = gtk_scale_button_constructed;
gobject_class->finalize = gtk_scale_button_finalize;
@@ -298,20 +296,30 @@ gtk_scale_button_class_init (GtkScaleButtonClass *klass)
G_TYPE_NONE, 0);
/* Key bindings */
binding_set = gtk_binding_set_by_class (widget_class);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0,
"popup", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0,
"popup", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
"popup", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
"popup", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
"popup", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
"popdown", 0);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_space, 0,
"popup",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Space, 0,
"popup",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Return, 0,
"popup",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_ISO_Enter, 0,
"popup",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Enter, 0,
"popup",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"popdown",
NULL);
/* Bind class to template
*/
-11
View File
@@ -245,16 +245,6 @@ gtk_scrollbar_class_init (GtkScrollbarClass *class)
gtk_widget_class_set_css_name (widget_class, I_("scrollbar"));
}
static gboolean
emit_popup_menu (GtkWidget *self)
{
gboolean handled;
g_signal_emit_by_name (self, "popup-menu", &handled);
return handled;
}
static void
gtk_scrollbar_init (GtkScrollbar *self)
{
@@ -265,7 +255,6 @@ gtk_scrollbar_init (GtkScrollbar *self)
priv->box = gtk_box_new (priv->orientation, 0);
gtk_widget_set_parent (priv->box, GTK_WIDGET (self));
priv->range = g_object_new (GTK_TYPE_RANGE, NULL);
g_signal_connect_swapped (priv->range, "popup-menu", G_CALLBACK (emit_popup_menu), self);
gtk_widget_set_hexpand (priv->range, TRUE);
gtk_widget_set_vexpand (priv->range, TRUE);
gtk_container_add (GTK_CONTAINER (priv->box), priv->range);
+34 -39
View File
@@ -28,7 +28,6 @@
#include "gtkadjustment.h"
#include "gtkadjustmentprivate.h"
#include "gtkbindings.h"
#include "gtkdnd.h"
#include "gtkeventcontrollermotion.h"
#include "gtkeventcontrollerscroll.h"
@@ -413,7 +412,7 @@ static GParamSpec *properties[NUM_PROPERTIES];
G_DEFINE_TYPE_WITH_PRIVATE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN)
static void
add_scroll_binding (GtkBindingSet *binding_set,
add_scroll_binding (GtkWidgetClass *widget_class,
guint keyval,
GdkModifierType mask,
GtkScrollType scroll,
@@ -421,27 +420,29 @@ add_scroll_binding (GtkBindingSet *binding_set,
{
guint keypad_keyval = keyval - GDK_KEY_Left + GDK_KEY_KP_Left;
gtk_binding_entry_add_signal (binding_set, keyval, mask,
"scroll-child", 2,
GTK_TYPE_SCROLL_TYPE, scroll,
G_TYPE_BOOLEAN, horizontal);
gtk_binding_entry_add_signal (binding_set, keypad_keyval, mask,
"scroll-child", 2,
GTK_TYPE_SCROLL_TYPE, scroll,
G_TYPE_BOOLEAN, horizontal);
gtk_widget_class_add_binding_signal (widget_class,
keyval, mask,
"scroll-child",
"(ib)", scroll, horizontal);
gtk_widget_class_add_binding_signal (widget_class,
keypad_keyval, mask,
"scroll-child",
"(ib)", scroll, horizontal);
}
static void
add_tab_bindings (GtkBindingSet *binding_set,
add_tab_bindings (GtkWidgetClass *widget_class,
GdkModifierType modifiers,
GtkDirectionType direction)
{
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
"move-focus-out", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
"move-focus-out", 1,
GTK_TYPE_DIRECTION_TYPE, direction);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Tab, modifiers,
"move-focus-out",
"(i)", direction);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_KP_Tab, modifiers,
"move-focus-out",
"(i)", direction);
}
static void
@@ -521,7 +522,6 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class;
GtkContainerClass *container_class;
GtkBindingSet *binding_set;
widget_class = (GtkWidgetClass*) class;
container_class = (GtkContainerClass*) class;
@@ -796,25 +796,23 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
NULL, NULL, NULL,
G_TYPE_NONE, 1, GTK_TYPE_POSITION_TYPE);
binding_set = gtk_binding_set_by_class (class);
add_scroll_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, TRUE);
add_scroll_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, TRUE);
add_scroll_binding (widget_class, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, FALSE);
add_scroll_binding (widget_class, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, FALSE);
add_scroll_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, TRUE);
add_scroll_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, TRUE);
add_scroll_binding (binding_set, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, FALSE);
add_scroll_binding (binding_set, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, FALSE);
add_scroll_binding (widget_class, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_BACKWARD, TRUE);
add_scroll_binding (widget_class, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_FORWARD, TRUE);
add_scroll_binding (widget_class, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_BACKWARD, FALSE);
add_scroll_binding (widget_class, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_FORWARD, FALSE);
add_scroll_binding (binding_set, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_BACKWARD, TRUE);
add_scroll_binding (binding_set, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_FORWARD, TRUE);
add_scroll_binding (binding_set, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_BACKWARD, FALSE);
add_scroll_binding (binding_set, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_FORWARD, FALSE);
add_scroll_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK, GTK_SCROLL_START, TRUE);
add_scroll_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK, GTK_SCROLL_END, TRUE);
add_scroll_binding (widget_class, GDK_KEY_Home, 0, GTK_SCROLL_START, FALSE);
add_scroll_binding (widget_class, GDK_KEY_End, 0, GTK_SCROLL_END, FALSE);
add_scroll_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK, GTK_SCROLL_START, TRUE);
add_scroll_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK, GTK_SCROLL_END, TRUE);
add_scroll_binding (binding_set, GDK_KEY_Home, 0, GTK_SCROLL_START, FALSE);
add_scroll_binding (binding_set, GDK_KEY_End, 0, GTK_SCROLL_END, FALSE);
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_SCROLLED_WINDOW_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("scrolledwindow"));
@@ -2922,19 +2920,16 @@ gtk_scrolled_window_move_focus_out (GtkScrolledWindow *scrolled_window,
GtkDirectionType direction_type)
{
GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
GtkWidget *toplevel;
/* Focus out of the scrolled window entirely. We do this by setting
* a flag, then propagating the focus motion to the notebook.
*/
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (scrolled_window)));
if (!GTK_IS_ROOT (toplevel))
return;
g_object_ref (scrolled_window);
priv->focus_out = TRUE;
g_signal_emit_by_name (toplevel, "move-focus", direction_type);
gtk_widget_activate_action (GTK_WIDGET (scrolled_window),
"focus.move", "i", direction_type);
priv->focus_out = FALSE;
g_object_unref (scrolled_window);
+41 -23
View File
@@ -30,7 +30,6 @@
#include "gtksearchentryprivate.h"
#include "gtkaccessible.h"
#include "gtkbindings.h"
#include "gtkeditable.h"
#include "gtkbox.h"
#include "gtkgestureclick.h"
@@ -125,6 +124,7 @@ typedef struct {
guint delayed_changed_id;
gboolean content_changed;
gboolean search_stopped;
gboolean activates_default;
} GtkSearchEntryPrivate;
static void gtk_search_entry_editable_init (GtkEditableInterface *iface);
@@ -137,6 +137,20 @@ G_DEFINE_TYPE_WITH_CODE (GtkSearchEntry, gtk_search_entry, GTK_TYPE_WIDGET,
/* 150 mseconds of delay */
#define DELAYED_TIMEOUT_ID 150
static void
gtk_search_entry_activate (GtkWidget *widget,
const char *action_name,
GVariant *parameters)
{
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
if (priv->activates_default)
gtk_widget_activate_default (widget);
else
g_signal_emit (entry, signals[ACTIVATE], 0);
}
static void
text_changed (GtkSearchEntry *entry)
{
@@ -191,9 +205,9 @@ gtk_search_entry_set_property (GObject *object,
break;
case PROP_ACTIVATES_DEFAULT:
if (gtk_text_get_activates_default (GTK_TEXT (priv->entry)) != g_value_get_boolean (value))
if (priv->activates_default != g_value_get_boolean (value))
{
gtk_text_set_activates_default (GTK_TEXT (priv->entry), g_value_get_boolean (value));
priv->activates_default = g_value_get_boolean (value);
g_object_notify_by_pspec (object, pspec);
}
break;
@@ -222,7 +236,7 @@ gtk_search_entry_get_property (GObject *object,
break;
case PROP_ACTIVATES_DEFAULT:
g_value_set_boolean (value, gtk_text_get_activates_default (GTK_TEXT (priv->entry)));
g_value_set_boolean (value, priv->activates_default);
break;
default:
@@ -326,7 +340,6 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkBindingSet *binding_set;
object_class->finalize = gtk_search_entry_finalize;
object_class->get_property = gtk_search_entry_get_property;
@@ -360,7 +373,7 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
signals[ACTIVATE] =
g_signal_new (I_("activate"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkSearchEntryClass, activate),
NULL, NULL,
NULL,
@@ -462,14 +475,28 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
NULL,
G_TYPE_NONE, 0);
binding_set = gtk_binding_set_by_class (klass);
gtk_widget_class_install_action (widget_class, "activate", NULL,
gtk_search_entry_activate);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_g, GDK_CONTROL_MASK,
"next-match", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_g, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
"previous-match", 0);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
"stop-search", 0);
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
"activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
"activate", NULL);
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
"activate", NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_g, GDK_CONTROL_MASK,
"next-match",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_g, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
"previous-match",
NULL);
gtk_widget_class_add_binding_signal (widget_class,
GDK_KEY_Escape, 0,
"stop-search",
NULL);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("entry"));
@@ -563,18 +590,10 @@ notify_cb (GObject *object,
gpointer data)
{
/* The editable interface properties are already forwarded by the editable delegate setup */
if (g_str_equal (pspec->name, "placeholder-text") ||
g_str_equal (pspec->name, "activates-default"))
if (g_str_equal (pspec->name, "placeholder-text"))
g_object_notify (data, pspec->name);
}
static void
activate_cb (GtkText *text,
gpointer data)
{
g_signal_emit (data, signals[ACTIVATE], 0);
}
static void
gtk_search_entry_init (GtkSearchEntry *entry)
{
@@ -588,7 +607,6 @@ gtk_search_entry_init (GtkSearchEntry *entry)
g_signal_connect_after (priv->entry, "changed", G_CALLBACK (gtk_search_entry_changed), entry);
g_signal_connect_swapped (priv->entry, "preedit-changed", G_CALLBACK (text_changed), entry);
g_signal_connect (priv->entry, "notify", G_CALLBACK (notify_cb), entry);
g_signal_connect (priv->entry, "activate", G_CALLBACK (activate_cb), entry);
priv->icon = gtk_image_new_from_icon_name ("edit-clear-symbolic");
gtk_widget_set_tooltip_text (priv->icon, _("Clear entry"));
+393
View File
@@ -0,0 +1,393 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#include "config.h"
#include "gtkshortcut.h"
#include "gtkintl.h"
#include "gtkshortcutaction.h"
#include "gtkshortcuttrigger.h"
#include "gtkwidget.h"
/**
* SECTION:gtkshortcut
* @title: GtkShortcut
* @short_description: A widget for displaying shortcut
* @see_also: #GtkShortcutController, #GtkShortcutAction,
* #GtkShortcutTrigger
*
* GtkShortcut is the low level object used for managing keyboard
* shortcuts.
*
* It contains a description of how to trigger the shortcut via a
* #GtkShortcutTrigger and a way to activate the shortcut on a widget
* via #GtkShortcutAction.
*
* The actual work is usually done via #GtkShortcutController, which
* decides if and when to activate a shortcut. Using that controller
* directly however is rarely necessary as various higher level
* convenience APIs exist on #GtkWidgets that make it easier to use
* shortcuts in GTK.
*
* #GtkShortcut does provide functionality to make it easy for users
* to work with shortcuts, either by providing informational strings
* for display purposes or by allowing shortcuts to be configured.
*/
struct _GtkShortcut
{
GObject parent_instance;
GtkShortcutAction *action;
GtkShortcutTrigger *trigger;
GVariant *args;
};
enum
{
PROP_0,
PROP_ACTION,
PROP_ARGUMENTS,
PROP_TRIGGER,
N_PROPS
};
G_DEFINE_TYPE (GtkShortcut, gtk_shortcut, G_TYPE_OBJECT)
static GParamSpec *properties[N_PROPS] = { NULL, };
static void
gtk_shortcut_dispose (GObject *object)
{
GtkShortcut *self = GTK_SHORTCUT (object);
g_clear_pointer (&self->action, gtk_shortcut_action_unref);
g_clear_pointer (&self->trigger, gtk_shortcut_trigger_unref);
g_clear_pointer (&self->args, g_variant_unref);
G_OBJECT_CLASS (gtk_shortcut_parent_class)->dispose (object);
}
static void
gtk_shortcut_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GtkShortcut *self = GTK_SHORTCUT (object);
switch (property_id)
{
case PROP_ACTION:
g_value_set_boxed (value, self->action);
break;
case PROP_ARGUMENTS:
g_value_set_variant (value, self->args);
break;
case PROP_TRIGGER:
g_value_set_boxed (value, self->trigger);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gtk_shortcut_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GtkShortcut *self = GTK_SHORTCUT (object);
switch (property_id)
{
case PROP_ACTION:
gtk_shortcut_set_action (self, g_value_dup_boxed (value));
break;
case PROP_ARGUMENTS:
gtk_shortcut_set_arguments (self, g_value_get_variant (value));
break;
case PROP_TRIGGER:
gtk_shortcut_set_trigger (self, g_value_dup_boxed (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gtk_shortcut_class_init (GtkShortcutClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->dispose = gtk_shortcut_dispose;
gobject_class->get_property = gtk_shortcut_get_property;
gobject_class->set_property = gtk_shortcut_set_property;
/**
* GtkShortcut:action:
*
* The action that gets activated by this shortcut.
*/
properties[PROP_ACTION] =
g_param_spec_boxed ("action",
P_("Action"),
P_("The action activated by this shortcut"),
GTK_TYPE_SHORTCUT_ACTION,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GtkShortcut:arguments:
*
* Arguments passed to activation.
*/
properties[PROP_ARGUMENTS] =
g_param_spec_variant ("arguments",
P_("Arguments"),
P_("Arguments passed to activation"),
G_VARIANT_TYPE_ANY,
NULL,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GtkShortcut:trigger:
*
* The trigger that triggers this shortcut.
*/
properties[PROP_TRIGGER] =
g_param_spec_boxed ("trigger",
P_("Trigger"),
P_("The trigger for this shortcut"),
GTK_TYPE_SHORTCUT_TRIGGER,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
}
static void
gtk_shortcut_init (GtkShortcut *self)
{
self->action = gtk_nothing_action_new ();
self->trigger = gtk_shortcut_trigger_ref (gtk_never_trigger_get ());
}
/**
* gtk_shortcut_new:
* @trigger: (transfer full) (allow-none): The trigger that will trigger the shortcut
* @action: (transfer full) (allow-none): The action that will be activated upon
* triggering
*
* Creates a new #GtkShortcut that is triggered by @trigger and then activates
* @action.
*
* Returns: a new #GtkShortcut
**/
GtkShortcut *
gtk_shortcut_new (GtkShortcutTrigger *trigger,
GtkShortcutAction *action)
{
GtkShortcut *shortcut;
shortcut = g_object_new (GTK_TYPE_SHORTCUT,
"action", action,
"trigger", trigger,
NULL);
if (trigger)
gtk_shortcut_trigger_unref (trigger);
if (action)
gtk_shortcut_action_unref (action);
return shortcut;
}
/**
* gtk_shortcut_new_with_arguments: (skip)
* @trigger: (transfer full) (allow-none): The trigger that will trigger the shortcut
* @action: (transfer full) (allow-none): The action that will be activated upon
* triggering
* @format_string: (allow-none): GVariant format string for arguments or %NULL for
* no arguments
* @...: arguments, as given by format string.
*
* Creates a new #GtkShortcut that is triggered by @trigger and then activates
* @action with arguments given by @format_string.
*
* Returns: a new #GtkShortcut
**/
GtkShortcut *
gtk_shortcut_new_with_arguments (GtkShortcutTrigger *trigger,
GtkShortcutAction *action,
const gchar *format_string,
...)
{
GtkShortcut *shortcut;
GVariant *args;
if (format_string)
{
va_list valist;
va_start (valist, format_string);
args = g_variant_new_va (format_string, NULL, &valist);
va_end (valist);
}
else
{
args = NULL;
}
shortcut = g_object_new (GTK_TYPE_SHORTCUT,
"action", action,
"arguments", args,
"trigger", trigger,
NULL);
if (trigger)
gtk_shortcut_trigger_unref (trigger);
if (action)
gtk_shortcut_action_unref (action);
return shortcut;
}
/**
* gtk_shortcut_get_action:
* @self: a #GtkShortcut
*
* Gets the action that is activated by this shortcut.
*
* Returns: (transfer none): the action
**/
GtkShortcutAction *
gtk_shortcut_get_action (GtkShortcut *self)
{
g_return_val_if_fail (GTK_IS_SHORTCUT (self), NULL);
return self->action;
}
/**
* gtk_shortcut_set_action:
* @self: a #GtkShortcut
* @action: (transfer full) (nullable): The new action.
* If the @action is %NULL, the nothing action will be used.
*
* Sets the new action for @self to be @action.
**/
void
gtk_shortcut_set_action (GtkShortcut *self,
GtkShortcutAction *action)
{
g_return_if_fail (GTK_IS_SHORTCUT (self));
if (action == NULL)
action = gtk_nothing_action_new ();
if (self->action == action)
{
gtk_shortcut_action_unref (action);
return;
}
gtk_shortcut_action_unref (self->action);
self->action = action;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ACTION]);
}
/**
* gtk_shortcut_get_trigger:
* @self: a #GtkShortcut
*
* Gets the trigger used to trigger @self.
*
* Returns: (transfer none): the trigger used
**/
GtkShortcutTrigger *
gtk_shortcut_get_trigger (GtkShortcut *self)
{
g_return_val_if_fail (GTK_IS_SHORTCUT (self), NULL);
return self->trigger;
}
/**
* gtk_shortcut_set_trigger:
* @self: a #GtkShortcut
* @trigger: (transfer full) (nullable): The new trigger.
* If the @trigger is %NULL, the never trigger will be used.
*
* Sets the new trigger for @self to be @trigger.
**/
void
gtk_shortcut_set_trigger (GtkShortcut *self,
GtkShortcutTrigger *trigger)
{
g_return_if_fail (GTK_IS_SHORTCUT (self));
if (trigger == NULL)
trigger = gtk_shortcut_trigger_ref (gtk_never_trigger_get ());
if (self->trigger == trigger)
{
gtk_shortcut_trigger_unref (trigger);
return;
}
gtk_shortcut_trigger_unref (self->trigger);
self->trigger = trigger;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TRIGGER]);
}
GVariant *
gtk_shortcut_get_arguments (GtkShortcut *self)
{
g_return_val_if_fail (GTK_IS_SHORTCUT (self), NULL);
return self->args;
}
void
gtk_shortcut_set_arguments (GtkShortcut *self,
GVariant *args)
{
g_return_if_fail (GTK_IS_SHORTCUT (self));
if (self->args == args)
return;
g_clear_pointer (&self->args, g_variant_unref);
if (args)
self->args = g_variant_ref_sink (args);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ARGUMENTS]);
}
+62
View File
@@ -0,0 +1,62 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_SHORTCUT_H__
#define __GTK_SHORTCUT_H__
#include <gtk/gtktypes.h>
G_BEGIN_DECLS
#define GTK_TYPE_SHORTCUT (gtk_shortcut_get_type ())
GDK_AVAILABLE_IN_ALL
G_DECLARE_FINAL_TYPE (GtkShortcut, gtk_shortcut, GTK, SHORTCUT, GObject)
GDK_AVAILABLE_IN_ALL
GtkShortcut * gtk_shortcut_new (GtkShortcutTrigger *trigger,
GtkShortcutAction *action);
GDK_AVAILABLE_IN_ALL
GtkShortcut * gtk_shortcut_new_with_arguments (GtkShortcutTrigger *trigger,
GtkShortcutAction *action,
const gchar *format_string,
...);
GDK_AVAILABLE_IN_ALL
GtkShortcutTrigger *
gtk_shortcut_get_trigger (GtkShortcut *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_set_trigger (GtkShortcut *self,
GtkShortcutTrigger *trigger);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction *
gtk_shortcut_get_action (GtkShortcut *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_set_action (GtkShortcut *self,
GtkShortcutAction *action);
GDK_AVAILABLE_IN_ALL
GVariant * gtk_shortcut_get_arguments (GtkShortcut *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_set_arguments (GtkShortcut *self,
GVariant *args);
G_END_DECLS
#endif /* __GTK_SHORTCUT_H__ */
File diff suppressed because it is too large Load Diff
+135
View File
@@ -0,0 +1,135 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_SHORTCUT_ACTION_H__
#define __GTK_SHORTCUT_ACTION_H__
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gtk/gtk.h> can be included directly."
#endif
#include <gtk/gtktypes.h>
G_BEGIN_DECLS
#define GTK_TYPE_SHORTCUT_ACTION (gtk_shortcut_action_get_type ())
#define GTK_IS_SHORTCUT_ACTION(obj) ((obj) != NULL)
/**
* GtkShortcutFunc:
* @widget: The widget passed to the activation
* @args: The arguments passed to the activation
* @user_data: The user data provided when activating the action
*
* Prototype for shortcuts based on user callbacks.
*/
typedef gboolean (* GtkShortcutFunc) (GtkWidget *widget,
GVariant *args,
gpointer user_data);
/**
* GtkShortcutActionFlags:
* @GTK_SHORTCUT_ACTION_EXCLUSIVE: The action is the only
* action that can be activated. If this flag is not set,
* a future activation may select a different action.
*
* List of flags that can be passed to action activation.
* More flags may be added in the future.
**/
typedef enum {
GTK_SHORTCUT_ACTION_EXCLUSIVE = 1 << 0
} GtkShortcutActionFlags;
/**
* GtkShortcutActionType:
* @GTK_SHORTCUT_ACTION_NOTHING: Don't ever activate
* @GTK_SHORTCUT_ACTION_CALLBACK: Call a custom user-provided callback
* @GTK_SHORTCUT_ACTION_ACTIVATE: Call gtk_widget_activate() on the widget
* @GTK_SHORTCUT_ACTION_MNEMONIC: Call gtk_widget_mnemonic_activate()
* on the widget
* @GTK_SHORTCUT_ACTION_SIGNAL: Emit the given action signal on the widget
* @GTK_SHORTCUT_ACTION_ACTION: Call the provided action on the widget
* @GTK_SHORTCUT_ACTION_GACTION: Activate a GAction
*
* The type of a action determines what the action does when activated.
**/
typedef enum {
GTK_SHORTCUT_ACTION_NOTHING,
GTK_SHORTCUT_ACTION_CALLBACK,
GTK_SHORTCUT_ACTION_ACTIVATE,
GTK_SHORTCUT_ACTION_MNEMONIC,
GTK_SHORTCUT_ACTION_SIGNAL,
GTK_SHORTCUT_ACTION_ACTION,
GTK_SHORTCUT_ACTION_GACTION
} GtkShortcutActionType;
GDK_AVAILABLE_IN_ALL
GType gtk_shortcut_action_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_shortcut_action_ref (GtkShortcutAction *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_action_unref (GtkShortcutAction *self);
GDK_AVAILABLE_IN_ALL
GtkShortcutActionType gtk_shortcut_action_get_action_type (GtkShortcutAction *self);
GDK_AVAILABLE_IN_ALL
char * gtk_shortcut_action_to_string (GtkShortcutAction *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_action_print (GtkShortcutAction *self,
GString *string);
GDK_AVAILABLE_IN_ALL
gboolean gtk_shortcut_action_activate (GtkShortcutAction *self,
GtkShortcutActionFlags flags,
GtkWidget *widget,
GVariant *args);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_nothing_action_new (void);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_callback_action_new (GtkShortcutFunc callback,
gpointer data,
GDestroyNotify destroy);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_mnemonic_action_new (void);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_activate_action_new (void);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_signal_action_new (const char *signal_name);
GDK_AVAILABLE_IN_ALL
const char * gtk_signal_action_get_signal_name (GtkShortcutAction *action);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_action_action_new (const char *name);
GDK_AVAILABLE_IN_ALL
const char * gtk_action_action_get_name (GtkShortcutAction *action);
GDK_AVAILABLE_IN_ALL
GtkShortcutAction * gtk_gaction_action_new (GAction *action);
GDK_AVAILABLE_IN_ALL
GAction * gtk_gaction_action_get_gaction (GtkShortcutAction *action);
G_END_DECLS
#endif /* __GTK_SHORTCUT_ACTION_H__ */
+29
View File
@@ -0,0 +1,29 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_SHORTCUT_ACTION_PRIVATE_H__
#define __GTK_SHORTCUT_ACTION_PRIVATE_H__
#include "gtkshortcutaction.h"
GtkShortcutAction * gtk_shortcut_action_parse_builder (GtkBuilder *builder,
const char *string,
GError **error);
#endif /* __GTK_SHORTCUT_ACTION_PRIVATE_H__ */
+664
View File
@@ -0,0 +1,664 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
/**
* SECTION:gtkshortcutcontroller
* @Short_description: Event controller for shortcuts
* @Title: GtkShortcutController
* @See_also: #GtkEventController, #GtkShortcut
*
* #GtkShortcutController is an event controller that manages shortcuts.
*
* #GtkShortcutController implements #GListModel for querying the shortcuts that
* have been added to it.
**/
#include "config.h"
#include "gtkshortcutcontrollerprivate.h"
#include "gtkbuildable.h"
#include "gtkconcatmodelprivate.h"
#include "gtkeventcontrollerprivate.h"
#include "gtkintl.h"
#include "gtkshortcut.h"
#include "gtkshortcutmanager.h"
#include "gtkshortcuttrigger.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
#include <gdk/gdk.h>
struct _GtkShortcutController
{
GtkEventController parent_instance;
GListModel *shortcuts;
GtkShortcutScope scope;
GdkModifierType mnemonics_modifiers;
guint last_activated;
guint custom_shortcuts : 1;
};
struct _GtkShortcutControllerClass
{
GtkEventControllerClass parent_class;
};
enum {
PROP_0,
PROP_MNEMONICS_MODIFIERS,
PROP_MODEL,
PROP_SCOPE,
N_PROPS
};
static GParamSpec *properties[N_PROPS] = { NULL, };
static GType
gtk_shortcut_controller_list_model_get_item_type (GListModel *list)
{
return GTK_TYPE_SHORTCUT;
}
static guint
gtk_shortcut_controller_list_model_get_n_items (GListModel *list)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (list);
return g_list_model_get_n_items (self->shortcuts);
}
static gpointer
gtk_shortcut_controller_list_model_get_item (GListModel *list,
guint position)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (list);
return g_list_model_get_item (self->shortcuts, position);
}
static void
gtk_shortcut_controller_list_model_init (GListModelInterface *iface)
{
iface->get_item_type = gtk_shortcut_controller_list_model_get_item_type;
iface->get_n_items = gtk_shortcut_controller_list_model_get_n_items;
iface->get_item = gtk_shortcut_controller_list_model_get_item;
}
static void
gtk_shortcut_controller_buildable_add_child (GtkBuildable *buildable,
GtkBuilder *builder,
GObject *child,
const gchar *type)
{
if (type != NULL)
{
GTK_BUILDER_WARN_INVALID_CHILD_TYPE (buildable, type);
}
if (GTK_IS_SHORTCUT (child))
{
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (buildable), GTK_SHORTCUT (child));
}
else
{
g_warning ("Cannot add an object of type %s to a controller of type %s",
g_type_name (G_OBJECT_TYPE (child)), g_type_name (G_OBJECT_TYPE (buildable)));
}
}
static void
gtk_shortcut_controller_buildable_init (GtkBuildableIface *iface)
{
iface->add_child = gtk_shortcut_controller_buildable_add_child;
}
G_DEFINE_TYPE_WITH_CODE (GtkShortcutController, gtk_shortcut_controller,
GTK_TYPE_EVENT_CONTROLLER,
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_shortcut_controller_list_model_init)
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, gtk_shortcut_controller_buildable_init))
static gboolean
gtk_shortcut_controller_is_rooted (GtkShortcutController *self)
{
GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
if (widget == NULL)
return FALSE;
return gtk_widget_get_root (widget) != NULL;
}
static GtkShortcutManager *
gtk_shortcut_controller_get_manager (GtkShortcutController *self)
{
switch (self->scope)
{
case GTK_SHORTCUT_SCOPE_LOCAL:
return NULL;
case GTK_SHORTCUT_SCOPE_MANAGED:
{
GtkWidget *widget;
for (widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
!GTK_IS_SHORTCUT_MANAGER (widget);
widget = _gtk_widget_get_parent (widget)) ;
return GTK_SHORTCUT_MANAGER (widget);
}
break;
case GTK_SHORTCUT_SCOPE_GLOBAL:
return GTK_SHORTCUT_MANAGER (gtk_widget_get_root (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self))));
break;
default:
g_assert_not_reached ();
}
return NULL;
}
static void
gtk_shortcut_controller_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
switch (prop_id)
{
case PROP_MNEMONICS_MODIFIERS:
gtk_shortcut_controller_set_mnemonics_modifiers (self, g_value_get_flags (value));
break;
case PROP_MODEL:
{
GListModel *model = g_value_get_object (value);
if (model && g_list_model_get_item_type (model) != GTK_TYPE_SHORTCUT)
{
g_warning ("Setting a model with type '%s' on a shortcut controller that requires 'GtkShortcut'",
g_type_name (g_list_model_get_item_type (model)));
model = NULL;
}
if (model == NULL)
{
self->shortcuts = G_LIST_MODEL (g_list_store_new (GTK_TYPE_SHORTCUT));
self->custom_shortcuts = TRUE;
}
else
{
self->shortcuts = g_object_ref (model);
self->custom_shortcuts = FALSE;
}
g_signal_connect_swapped (self->shortcuts, "items-changed", G_CALLBACK (g_list_model_items_changed), self);
}
break;
case PROP_SCOPE:
gtk_shortcut_controller_set_scope (self, g_value_get_enum (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
gtk_shortcut_controller_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
switch (prop_id)
{
case PROP_MNEMONICS_MODIFIERS:
g_value_set_flags (value, self->mnemonics_modifiers);
break;
case PROP_MODEL:
g_value_set_object (value, self->shortcuts);
break;
case PROP_SCOPE:
g_value_set_enum (value, self->scope);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
gtk_shortcut_controller_dispose (GObject *object)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
if (self->custom_shortcuts)
g_list_store_remove_all (G_LIST_STORE (self->shortcuts));
G_OBJECT_CLASS (gtk_shortcut_controller_parent_class)->dispose (object);
}
static void
gtk_shortcut_controller_finalize (GObject *object)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
g_signal_handlers_disconnect_by_func (self->shortcuts, g_list_model_items_changed, self);
g_clear_object (&self->shortcuts);
G_OBJECT_CLASS (gtk_shortcut_controller_parent_class)->finalize (object);
}
static gboolean
gtk_shortcut_controller_trigger_shortcut (GtkShortcutController *self,
GtkShortcut *shortcut,
guint position,
const GdkEvent *event,
gboolean enable_mnemonics,
gboolean exclusive)
{
GtkWidget *widget;
if (!gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
return FALSE;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
if (!self->custom_shortcuts &&
GTK_IS_CONCAT_MODEL (self->shortcuts))
{
GListModel *model = gtk_concat_model_get_model_for_item (GTK_CONCAT_MODEL (self->shortcuts), position);
if (GTK_IS_SHORTCUT_CONTROLLER (model))
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (model));
}
self->last_activated = position;
return gtk_shortcut_action_activate (gtk_shortcut_get_action (shortcut),
exclusive ? GTK_SHORTCUT_ACTION_EXCLUSIVE : 0,
widget,
gtk_shortcut_get_arguments (shortcut));
}
static gboolean
gtk_shortcut_controller_run_controllers (GtkEventController *controller,
const GdkEvent *event,
gboolean enable_mnemonics)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
guint n_items;
guint i;
guint n_triggered;
gboolean exclusive;
n_items = g_list_model_get_n_items (self->shortcuts);
n_triggered = 0;
for (i = 0; i < n_items; i++)
{
GtkShortcut *shortcut = g_list_model_get_item (self->shortcuts, i);
g_object_unref (shortcut);
if (gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
n_triggered++;
if (n_triggered > 1)
break;
}
if (n_triggered == 0)
return FALSE;
exclusive = n_triggered == 1;
for (i = 0; i < n_items; i++)
{
guint position = (self->last_activated + 1 + i) % n_items;
GtkShortcut *shortcut = g_list_model_get_item (self->shortcuts, position);
g_object_unref (shortcut);
if (gtk_shortcut_controller_trigger_shortcut (self,
shortcut,
position,
event,
enable_mnemonics,
exclusive))
return TRUE;
}
return FALSE;
}
static gboolean
gtk_shortcut_controller_handle_event (GtkEventController *controller,
const GdkEvent *event)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
gboolean enable_mnemonics;
if (self->scope != GTK_SHORTCUT_SCOPE_LOCAL)
return FALSE;
if (gdk_event_get_event_type (event) == GDK_KEY_PRESS)
{
GdkModifierType modifiers;
gdk_event_get_state (event, &modifiers);
enable_mnemonics = (modifiers & gtk_accelerator_get_default_mod_mask ()) == self->mnemonics_modifiers;
}
else
{
enable_mnemonics = FALSE;
}
return gtk_shortcut_controller_run_controllers (controller, event, enable_mnemonics);
}
static void
gtk_shortcut_controller_set_widget (GtkEventController *controller,
GtkWidget *widget)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
GTK_EVENT_CONTROLLER_CLASS (gtk_shortcut_controller_parent_class)->set_widget (controller, widget);
if (_gtk_widget_get_root (widget))
gtk_shortcut_controller_root (self);
}
static void
gtk_shortcut_controller_unset_widget (GtkEventController *controller)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
GtkWidget *widget = gtk_event_controller_get_widget (controller);
if (_gtk_widget_get_root (widget))
gtk_shortcut_controller_unroot (self);
GTK_EVENT_CONTROLLER_CLASS (gtk_shortcut_controller_parent_class)->unset_widget (controller);
}
static void
gtk_shortcut_controller_class_init (GtkShortcutControllerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkEventControllerClass *controller_class = GTK_EVENT_CONTROLLER_CLASS (klass);
object_class->dispose = gtk_shortcut_controller_dispose;
object_class->finalize = gtk_shortcut_controller_finalize;
object_class->set_property = gtk_shortcut_controller_set_property;
object_class->get_property = gtk_shortcut_controller_get_property;
controller_class->handle_event = gtk_shortcut_controller_handle_event;
controller_class->set_widget = gtk_shortcut_controller_set_widget;
controller_class->unset_widget = gtk_shortcut_controller_unset_widget;
/**
* GtkShortcutController:mnemonic-modifiers:
*
* The modifiers that need to be pressed to allow mnemonics activation.
*/
properties[PROP_MNEMONICS_MODIFIERS] =
g_param_spec_flags ("mnemonic-modifiers",
P_("Mnemonic modifers"),
P_("The modifiers to be pressed to allow mnemonics activation"),
GDK_TYPE_MODIFIER_TYPE,
GDK_MOD1_MASK,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GtkShortcutController:model:
*
* A list model to take shortcuts from
*/
properties[PROP_MODEL] =
g_param_spec_object ("model",
P_("Model"),
P_("A list model to take shortcuts from"),
G_TYPE_LIST_MODEL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GtkShortcutController:scope:
*
* What scope the shortcuts will be handled in.
*/
properties[PROP_SCOPE] =
g_param_spec_enum ("scope",
P_("Scope"),
P_("What scope the shortcuts will be handled in"),
GTK_TYPE_SHORTCUT_SCOPE,
GTK_SHORTCUT_SCOPE_LOCAL,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, properties);
}
static void
gtk_shortcut_controller_init (GtkShortcutController *self)
{
self->mnemonics_modifiers = GDK_MOD1_MASK;
}
void
gtk_shortcut_controller_root (GtkShortcutController *self)
{
GtkShortcutManager *manager = gtk_shortcut_controller_get_manager (self);
if (manager)
GTK_SHORTCUT_MANAGER_GET_IFACE (manager)->add_controller (manager, self);
}
void
gtk_shortcut_controller_unroot (GtkShortcutController *self)
{
GtkShortcutManager *manager = gtk_shortcut_controller_get_manager (self);
if (manager)
GTK_SHORTCUT_MANAGER_GET_IFACE (manager)->remove_controller (manager, self);
}
GtkEventController *
gtk_shortcut_controller_new (void)
{
return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER,
NULL);
}
GtkEventController *
gtk_shortcut_controller_new_for_model (GListModel *model)
{
g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL);
g_return_val_if_fail (g_list_model_get_item_type (model) == GTK_TYPE_SHORTCUT, NULL);
return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER,
"model", model,
NULL);
}
/**
* gtk_shortcut_controller_add_shortcut:
* @self: the controller
* @shortcut: a #GtkShortcut
*
* Adds @shortcut to the list of shortcuts handled by @self.
*
* If this controller uses an external shortcut list, this function does
* nothing.
*
* The shortcut is added to the list so that it is triggered before
* all existing shortcuts.
*
* FIXME: What's supposed to happen if a shortcut gets added twice?
**/
void
gtk_shortcut_controller_add_shortcut (GtkShortcutController *self,
GtkShortcut *shortcut)
{
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
if (!self->custom_shortcuts)
return;
g_list_store_append (G_LIST_STORE (self->shortcuts), shortcut);
}
/**
* gtk_shortcut_controller_remove_shortcut:
* @self: the controller
* @shortcut: a #GtkShortcut
*
* Removes @shortcut from the list of shortcuts handled by @self.
*
* If @shortcut had not been added to @controller or this controller
* uses an external shortcut list, this function does nothing.
**/
void
gtk_shortcut_controller_remove_shortcut (GtkShortcutController *self,
GtkShortcut *shortcut)
{
guint i;
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
if (!self->custom_shortcuts)
return;
for (i = 0; i < g_list_model_get_n_items (self->shortcuts); i++)
{
GtkShortcut *item = g_list_model_get_item (self->shortcuts, i);
if (item == shortcut)
{
g_object_unref (item);
g_list_store_remove (G_LIST_STORE (self->shortcuts), i);
return;
}
g_object_unref (item);
}
}
/**
* gtk_shortcut_controller_set_scope:
* @self: a #GtkShortcutController
* @scope: the new scope to use
*
* Sets the controller to have the given @scope.
*
* The scope allows shortcuts to be activated outside of the normal
* event propagation. In particular, it allows installing global
* keyboard shortcuts that can be activated even when a widget does
* not have focus.
**/
void
gtk_shortcut_controller_set_scope (GtkShortcutController *self,
GtkShortcutScope scope)
{
gboolean rooted;
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
if (self->scope == scope)
return;
rooted = gtk_shortcut_controller_is_rooted (self);
if (rooted)
gtk_shortcut_controller_unroot (self);
self->scope = scope;
if (rooted)
gtk_shortcut_controller_root (self);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SCOPE]);
}
/**
* gtk_shortcut_controller_get_scope:
* @self: a #GtkShortcutController
*
* Gets the scope for when this controller activates its shortcuts. See
* gtk_shortcut_controller_set_scope() for details.
*
* Returns: the controller's scope
**/
GtkShortcutScope
gtk_shortcut_controller_get_scope (GtkShortcutController *self)
{
g_return_val_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self), GTK_SHORTCUT_SCOPE_LOCAL);
return self->scope;
}
/**
* gtk_shortcut_controller_set_mnemonics_modifiers:
* @self: a #GtkShortcutController
* @modifiers: the new mnemonics_modifiers to use
*
* Sets the controller to have the given @mnemonics_modifiers.
*
* The mnemonics modifiers determines which modifiers need to be pressed to allow
* activation of shortcuts with mnemonics triggers.
*
* This value is only relevant for local shortcut controllers. Global and managed
* shortcut controllers will have their shortcuts activated from other places which
* have their own modifiers for activating mnemonics.
**/
void
gtk_shortcut_controller_set_mnemonics_modifiers (GtkShortcutController *self,
GdkModifierType modifiers)
{
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
if (self->mnemonics_modifiers == modifiers)
return;
self->mnemonics_modifiers = modifiers;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MNEMONICS_MODIFIERS]);
}
/**
* gtk_shortcut_controller_get_mnemonics_modifiers:
* @self: a #GtkShortcutController
*
* Gets the mnemonics modifiers for when this controller activates its shortcuts. See
* gtk_shortcut_controller_set_mnemonics_modifiers() for details.
*
* Returns: the controller's mnemonics modifiers
**/
GdkModifierType
gtk_shortcut_controller_get_mnemonics_modifiers (GtkShortcutController *self)
{
g_return_val_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self), GTK_SHORTCUT_SCOPE_LOCAL);
return self->mnemonics_modifiers;
}
+70
View File
@@ -0,0 +1,70 @@
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_SHORTCUT_CONTROLLER_H__
#define __GTK_SHORTCUT_CONTROLLER_H__
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gtk/gtk.h> can be included directly."
#endif
#include <gtk/gtkeventcontroller.h>
G_BEGIN_DECLS
#define GTK_TYPE_SHORTCUT_CONTROLLER (gtk_shortcut_controller_get_type ())
#define GTK_SHORTCUT_CONTROLLER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_SHORTCUT_CONTROLLER, GtkShortcutController))
#define GTK_SHORTCUT_CONTROLLER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_SHORTCUT_CONTROLLER, GtkShortcutControllerClass))
#define GTK_IS_SHORTCUT_CONTROLLER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_SHORTCUT_CONTROLLER))
#define GTK_IS_SHORTCUT_CONTROLLER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_SHORTCUT_CONTROLLER))
#define GTK_SHORTCUT_CONTROLLER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_SHORTCUT_CONTROLLER, GtkShortcutControllerClass))
typedef struct _GtkShortcutController GtkShortcutController;
typedef struct _GtkShortcutControllerClass GtkShortcutControllerClass;
GDK_AVAILABLE_IN_ALL
GType gtk_shortcut_controller_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkEventController * gtk_shortcut_controller_new (void);
GDK_AVAILABLE_IN_ALL
GtkEventController * gtk_shortcut_controller_new_for_model (GListModel *list);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_controller_set_mnemonics_modifiers (GtkShortcutController *self,
GdkModifierType modifiers);
GDK_AVAILABLE_IN_ALL
GdkModifierType gtk_shortcut_controller_get_mnemonics_modifiers (GtkShortcutController *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_controller_set_scope (GtkShortcutController *self,
GtkShortcutScope scope);
GDK_AVAILABLE_IN_ALL
GtkShortcutScope gtk_shortcut_controller_get_scope (GtkShortcutController *self);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_controller_add_shortcut (GtkShortcutController *self,
GtkShortcut *shortcut);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_controller_remove_shortcut (GtkShortcutController *self,
GtkShortcut *shortcut);
G_END_DECLS
#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */
@@ -1,10 +1,10 @@
/* GTK - The GIMP Toolkit
* Copyright (C) 2011 Red Hat, Inc.
/*
* Copyright © 2018 Benjamin Otte
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -13,18 +13,16 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_BINDINGS_PRIVATE_H__
#define __GTK_BINDINGS_PRIVATE_H__
#ifndef __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__
#define __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__
#include "gtkbindings.h"
#include "gtkshortcutcontroller.h"
G_BEGIN_DECLS
void gtk_shortcut_controller_root (GtkShortcutController *controller);
void gtk_shortcut_controller_unroot (GtkShortcutController *controller);
guint _gtk_binding_parse_binding (GScanner *scanner);
void _gtk_binding_reset_parsed (void);
G_END_DECLS
#endif /* __GTK_BINDINGS_PRIVATE_H__ */
#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */
+2 -3
View File
@@ -129,7 +129,7 @@ get_labels (guint key, GdkModifierType modifier, guint *n_mods)
const gchar *labels[16];
GList *freeme = NULL;
gchar key_label[6];
gchar *tmp;
const gchar *tmp;
gunichar ch;
gint i = 0;
gchar **retval;
@@ -304,8 +304,7 @@ parse_combination (GtkShortcutLabel *self,
accels = g_strsplit (str, "&", 0);
for (k = 0; accels[k]; k++)
{
gtk_accelerator_parse (accels[k], &key, &modifier);
if (key == 0 && modifier == 0)
if (!gtk_accelerator_parse (accels[k], &key, &modifier))
{
retval = FALSE;
break;

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