Development/Tutorials/Creating Konqueror Service Menus: Difference between revisions

    From KDE TechBase
    (initial import of: http://developer.kde.org/documentation/tutorials/dot/servicemenus.html)
     
    (→‎And Now Back to Our Regularly Scheduled Broadcast...: small edit to add Type=Service to more examples, service menu will not show in KDE4 without and it's stated above that it's required anyway)
    (34 intermediate revisions by 11 users not shown)
    Line 1: Line 1:
    ''Author:'' [mailto:aseigo@kde.org Aaron J. Seigo, [email protected]]
    {{Note|Part of this tutorial apply only to KDE3. Specially the dcop-part.}}


    ''The ability to select mimetype-specific actions from Konqueror's context menu is an often requested feature. The pleasant surprise is that this is already possible. The even more pleasant surprise is that you don't need to be a software developer to create new actions. This article details step-by-step how to quickly and easily add new actions to Konqueror's context menu.''
    ''The ability to select mimetype-specific actions from a KDE file manager's context menu is an often requested feature. The pleasant surprise is that this is already possible. The even more pleasant surprise is that you don't need to be a software developer to create new actions. This article details step-by-step how to quickly and easily add new actions to KDE file manager context menus.''


    === Introduction  ===
    === Introduction  ===
    In KDE-speak a "servicemenu" is a special entry that appears in Konqueror's context menu
    In KDE-speak a "servicemenu" is a special entry that appears in a context menu (or other context-based interface) for a file (or for directory), depending on the type of files that are selected.
    depending on the file(s) that are selected. You may have seen them in action without even knowing it.
    For instance, if you have the KDE file archive utility "ark" installed you will see a menu entry
    to "Extract here..." whenever you right click on a tarball or zip file. The option to "Extract here..."
    is a servicemenu.


    Creating new servicemenus is very simple, requiring nothing more than an idea and a text editor.
    For example, if you have the KDE file archive utility Ark installed you will see a menu entry to "Extract here..." whenever you right click on a file archive. The option to "Extract here..." is a servicemenu.
    You don't have to be a programmer or a KDE wizard to make them.
    In this tutorial we will be creating a set of actions that allows us to set an image as our desktop
    wallpaper just by right clicking on it and selecting "Use As Wallpaper".
    By the end of this tutorial you should be able to create your own servicemenus with ease.


    === Where the Servicemenus Live ===
    Creating new servicemenus is very simple, requiring nothing more than an idea and a text editor. You don't have to be a programmer or a KDE wizard to make them. In this tutorial we will be creating a set of actions that allows us to set an image as our desktop wallpaper just by right clicking on it and selecting "Use As Wallpaper". By the end of this tutorial you should be able to create your own servicemenus with ease.
     
    === Where the Servicemenus Locate ===
    Servicemenus are defined using {{path|.desktop}} files, which are the same kind of files that are used
    Servicemenus are defined using {{path|.desktop}} files, which are the same kind of files that are used
    to create entries in the K Menu or on the KDE desktop. These servicemenu files are found in
    to create entries in the K Menu or on the KDE desktop. These servicemenu files are found in
    {{path|$KDEHOME/share/apps/konqueror/servicemenus}}, the directory KDE was installed to
    {{path|$KDEHOME/share/services/ServiceMenus}}, the directory KDE was installed to
    or any directory listed in the $KDEDIRS environment variable.
    or any directory listed in the $KDEDIRS environment variable.


    In the case of my home machine that means that servicemenu files can be found
    In the case of my home machine that means that servicemenu files can be found
    in the following places:
    in the following places:
    {{path|/opt/kde4/share/services/ServiceMenus/}}
    {{path|/usr/share/services/ServiceMenus/}}
    {{path|/home/aaron/.kde4/share/kde4/services/ServiceMenus/}}


    /opt/kde3/share/apps/konqueror/servicemenus/
    {{tip|$KDEHOME defaults to ~/.kde when it isn't set or defined. You can find all the services directories by running <syntaxhighlight lang="text">kde4-config --path services</syntaxhighlight> from a Konsole window.}}
    /usr/share/apps/konqueror/servicemenus/
    /home/aaron/.kde3/share/apps/konqueror/servicemenus/


    {{Tip|$KDEHOME defaults to {{path|~/.kde}} when it isn't set or defined. You can confirm this by running <code>kde4-config --localprefix</code> from a Konsole window. To locate where KDE was installed to, run <code>kde4-config --prefix</code> from a Konsole window.
    === The Start of Servicemenu ===
     
    === The Start of Our Servicemenu ===
    We will begin creating our wallpaper servicemenu by choosing a name for the file:
    We will begin creating our wallpaper servicemenu by choosing a name for the file:
    {{path|setAsWallpaper.desktop}} sounds good. The only thing that really matters with regards to the name is that it
    {{path|setAsWallpaper.desktop}} sounds good. The only thing that really matters with regards to the name is that it
    is unique and that it ends with {{path|.desktop}}. Next we'll open up the file in a text editor. The
    is unique and that it ends with {{path|.desktop}}. Next we'll open up the file in a text editor. The
    first thing we will put in the file is the "Desktop Entry" section:
    first thing we will put in the file is the "Desktop Entry" section:
    [Desktop Entry]
    <syntaxhighlight lang="ini">
    ServiceTypes=image/png,image/jpeg
    [Desktop Entry]
    Actions=setAsWallpaper
    Type=Service
     
    ServiceTypes=KonqPopupMenu/Plugin
    Every servicemenu file ''must'' have these three lines. Let's examine each of these lines one at a time.
    MimeType=image/png;image/jpeg;
    Actions=setAsWallpaper
    </syntaxhighlight>


    [Desktop Entry]
    Every servicemenu file ''must'' have these four lines. Let's examine each of these lines one at a time.


    <syntaxhighlight lang="ini">
    [Desktop Entry]
    </syntaxhighlight>
    KDE configuration files, including .desktop files, seperate the individual settings into sections. A section starts
    KDE configuration files, including .desktop files, seperate the individual settings into sections. A section starts
    with a heading made up of letters, numbers and spaces in between square brackets on a line
    with a heading made up of letters, numbers and spaces in between square brackets on a line
    Line 49: Line 47:
    belong to the "Desktop Entry" group.
    belong to the "Desktop Entry" group.


    ServiceTypes=image/png,image/jpeg
    <syntaxhighlight lang="ini">
    Type=Service
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/png;image/jpeg;
    </syntaxhighlight>
     
    The first line indicates that this .desktop file is of type Service; this is necessary since the default type is Application (i.e. something with an Exec line). Service is anything else, like plugins.


    The ServiceTypes entry refers to the mimetypes that this servicemenu applies to. You can define more than one
    The ServiceTypes entry refers to the type of plugin that this desktop file defines, and specifies that it is actually a Konqueror service menu.  
    mimetype by providing a list seperated by commas (but no spaces). In this case we our servicemenu will show
    up when we select PNG or JPEG images. The File Associations control panel is a good place to look for mimetype definitions.
    {{Tip|To create a servicemenu for directories use the <code>inode/directory</code> mimetype.
    To create a servicemenu for all files, use the special <code>all/all</code> mimetype.
    To create a servicemenu for all files, but not directories, use the <code>all/allfiles</code> mimetype.}}


    New in KDE 3.2 is the ability to specify an entire group of mimetypes using typeglobs. To make our servicemenu apply not only to PNGs and JPEGs but to all images we would simply change the ServiceTypes entry to be:
    The MimeType line defines the type of file for which this servicemenu applies. You can define more than one mimetype by providing a list seperated by semicolons (but no spaces). In this case our servicemenu will show up when we select PNG or JPEG images. The File Associations control panel is a good place to look for mimetype definitions.
    ServiceTypes=image/*
     
    {{Tip|To create a servicemenu for directories use the <syntaxhighlight lang="text">inode/directory</syntaxhighlight> mimetype. To create a servicemenu for all files, use the base <syntaxhighlight lang="text">application/octet-stream</syntaxhighlight> mimetype.}}
     
    You can also specify an entire group of mimetypes using "typeglobs". To make our servicemenu apply not only to PNGs and JPEGs but to all images we would simply change the ServiceTypes entry to be:
    <syntaxhighlight lang="ini">
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/*;
    </syntaxhighlight>
    Now when we right click on ''any'' image file in Konqueror we can select it as our background.
    Now when we right click on ''any'' image file in Konqueror we can select it as our background.
    Actions=setAsWallpaper
    <syntaxhighlight lang="ini">
    The Actions entry defines the actions we will create in our servicemenu. As with the ServiceTypes, you can define more
    Actions=setAsWallpaper
    than one action by using a semicolon separated list. Each of the actions listed will get a section of its own
    </syntaxhighlight>
    defining what that action does. In fact, that's our very next step.
    The Actions entry defines the actions we will create in our servicemenu. As with the ServiceTypes, you can define more than one action by using a semicolon separated list. Each of the actions listed will get a section of its own defining what that action does. In fact, that's our very next step.


    === Creating an Action ===
    === Creating an Action ===
    So far we have defined one action in our servicemenu file: setAsWallpaper. Now we need to define
    So far we have defined one action in our servicemenu file: setAsWallpaper. Now we need to define what that action looks like and what it actually does. We begin by adding a new heading to the end of our file:
    what that action looks like and what it actually does. We begin by adding a new heading to the end of our file:
     
    [Desktop Action setAsWallpaper]
    <syntaxhighlight lang="ini">
    [Desktop Action setAsWallpaper]
    </syntaxhighlight>
     
    Note that it contains the setAsWallpaper action name. It is important to note that these files are case sensitive, so we need to watch the capitalization here. Now that we have a section for our action, let's give our action a name that the user will see.
     
    <syntaxhighlight lang="ini">
    Name=Set As Background Image
    </syntaxhighlight>
     
    To translate the name, we add another <tt>Name</tt> entry followed by the language code. For instance, the Finnish translation for the "Set As Background Image" service is provided by an entry that looks like this:
     
    <syntaxhighlight lang="ini">
    Name[fi]=Aseta taustakuvaksi
    </syntaxhighlight>


    Note that it contains the setAsWallpaper action name. It is important to note that these files
    are case sensitive, so we need to watch the capitalization here. Now that we have a section for our action,
    let's give our action a name that the user will see.
    Name=Set As Background Image
    Next let's add an icon:
    Next let's add an icon:
    Icon=background


    Notice that we didn't include the .png file extension, but just referred to the icon by name. If we had left
    <syntaxhighlight lang="ini">
    this line out our action would still work, it just wouldn't look as fancy. Now that we've achieved
    Icon=background
    fancyness, let's finish up by making it useful:
    </syntaxhighlight>
    Exec=dcop kdesktop KBackgroundIface setWallpaper %u 6


    The Exec line defines what is run when the user selects the action from the menu. We can put any command we want
    Notice that we didn't include the .png file extension, but just referred to the icon by name. If we had left this line out our action would still work, it just wouldn't look as fancy. Now that we've achieved fancyness, let's finish up by making it useful:
    there. The magic in this line is the "%u" which gets replaced with the URL of the image file before the
    <syntaxhighlight lang="ini">
    command is run. If our command can accept more than one file at a time we can use "%U" instead.
    Exec=dcop kdesktop KBackgroundIface setWallpaper %u 6
    </syntaxhighlight>
     
    The Exec line defines what is run when the user selects the action from the menu. We can put any command we want there. The magic in this line is the "%u" which gets replaced with the URL of the image file before the command is run. If our command can accept more than one file at a time we can use "%U" instead.
    There are [http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html other special %values] but %u and %U are probably the most useful for servicemenus.
    There are [http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html other special %values] but %u and %U are probably the most useful for servicemenus.


    Our file now looks like this:
    Our file now looks like this:
    [Desktop Entry]
    <syntaxhighlight lang="ini">
    ServiceTypes=image/*
    [Desktop Entry]
    Actions=setAsWallpaper
    Type=Service
    ServiceTypes=KonqPopupMenu/Plugin
    [Desktop Action setAsWallpaper]
    MimeType=image/*;
    Name=Use As Wallpaper
    Actions=setAsWallpaper
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6


    If we save it and open up Konqueror, when we right click on a PNG, JPEG or GIF image we should now have a
    [Desktop Action setAsWallpaper]
    "Set as background" item in the menu. Try it out!
    Name=Use As Wallpaper
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6
    </syntaxhighlight>
     
    If we save it and open up Konqueror, when we right click on a PNG, JPEG or GIF image we should now have a "Set as background" item in the menu. Try it out!


    {{Tip|If you have a complex task that requires more than one command (for example if we wanted to copy the image file somewhere first and then use dcop to set it as the background) use a shell:<br/>
    {{Tip|If you have a complex task that requires more than one command (for example if we wanted to copy the image file somewhere first and then use dcop to set it as the background) use a shell:<br/>
    Exec<nowiki>=</nowiki>/bin/sh -c "&lt;YOUR COMMANDS HERE&gt;"}}


    === A Brief Excursion, or "The Amazingly Useful kdcop" ===
    Exec<nowiki>=</nowiki>/bin/sh -c ";&lt;YOUR COMMANDS HERE&gt;"}}
    [[Image:servicemenus_kdcop.png|thumb|right|400px]] Before we explore with our servicemenu a bit more, let's take a look at that exec line:
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6


    It may look complicated but it really isn't. The command takes
    === And Now Back to Our Regularly Scheduled Broadcast... ===
    advantage of the KDE DCOP service which is used by KDE programs to talk to each other. Fortunately for us, we can also
    use it for scripting.


    The first thing I did when formulating the Exec line was to run <code>kdcop</code> which is a graphical DCOP browser.
    Back from the land of DCOP, we have produced a working servicemenu. Now what? We improve it, of course!
    Using it you can see every DCOP interface that is available for use at that moment. Browsing through the listing I found the
    kdesktop entry and expanded it. Under kdesktop I quickly found the KBackgroundIface, and expanding that node of the tree
    I spotted what I was looking for: <code>setWallpaper</code>! According to the listing it took two arguments:
    a QString (which is just a bunch of text) called "wallpaper"
    and an integer called (somewhat mysteriously) "mode".
     
    With setAsWallpaper.desktop open in KWrite I simply
    dragged and dropped the setWallpaper entry into Exec line!
    From there I replaced the parameters "wallpaper mode" with "%U 6".<p>


    Presto! Blamo! It worked! Now you're probably wondering where I got the number 6 from. The answer
    Our current servicemenu scales the image to the size of the desktop and sets it as the wallpaper. But this isn't appropriate for wallpaper tiles which not be scaled but should be, well, ''tiled''. So let's add an action for tiles.
    is I tried a bunch of numbers starting at 0 and working my way up until I achieved the results I
    First we'll need to change the Actions line to say something like this:
    wanted. I could've looked at the source code or read the developer's documentation, but I opted
    for the guess-and-test method instead.


    === And Now Back to Our Regularly Scheduled Broadcast... ===
    <syntaxhighlight lang="text">
    Actions=setAsWallpaper;tileAsWallpaper;
    </syntaxhighlight>
    Note the use of semicolons rather than commas in that line. Next, we'll add a new action section to the end of the file that looks something like this:
    <syntaxhighlight lang="ini">


    Back from the land of DCOP, we have produced a working servicemenu. Now what? We improve it, of course!
    [Desktop Action tileAsWallpaper]
    Name=Use As Wallpaper Tile
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2
    </syntaxhighlight>


    Our current servicemenu scales the image to the size of the desktop and sets it as the wallpaper.
    Note that "tileAsWallpaper" appears in the action section's heading. This is what tells Konqueror which action it is. In addition, we have a slightly different Name and a very slightly different Exec line. Now when we right click on an image we have another option, this time to tile the image across our desktop. We didn't even have to restart Konqueror, since it automatically rereads the file when it changes!
    But this isn't appropriate for wallpaper tiles which not be scaled but should be, well, ''tiled''.
    So let's add an action for tiles.
    First we'll need to change the Actions line
    to say something like this:
    Actions=setAsWallpaper;tileAsWallpaper
    Note the use of a semicolon. While the ServiceTypes are separated by commas, Actions are separated with semicolons.
    Quirks-R-Us. Moving right along, we'll add a new action section to the end of the file that looks something like this:
    [Desktop Action tileAsWallpaper]
    Name=Use As Wallpaper Tile
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2


    Note that "tileAsWallpaper" appears in the action section's heading. This is what
    KDE's desktop offers several background image options, of which Scale and Tile are just two. Of course if we start adding all those various background options, and then add those to all the other servicemenus that a typical KDE installation has it's easy to see how the Action menu can quickly get out of hand. Starting with KDE 3.2 we can create submenus for our servicemenus by adding a line like the following to the <syntaxhighlight lang="ini">[Desktop Entry]</syntaxhighlight> group of the .desktop file:
    tells Konqueror which action it is. In addition, we have a slightly different Name and a very slightly
    <syntaxhighlight lang="ini">
    different Exec line. Now when we right click on an image we have another option, this time to tile
    X-KDE-Submenu=Set As Background
    the image across our desktop. We didn't even have to restart Konqueror, since it automatically rereads
    </syntaxhighlight>
    the file when it changes!
     
    KDE's desktop offers several background image options, of which Scale and Tile are just two. Of course if we start adding all those various background options, and then add those to all the other servicemenus that a typical KDE installation has it's easy to see how the Action menu can quickly get out of hand. Starting with KDE 3.2 we can create submenus for our servicemenus by adding a line like the following to the <code>[Desktop Entry]</code> group of the .desktop file:
    X-KDE-Submenu=Set As Background
    This will create a submenu called "Set As Background" and put all of the servicemenu's actions into it.
    This will create a submenu called "Set As Background" and put all of the servicemenu's actions into it.
    Our servicemenu .desktop file now looks like this:
    Our servicemenu .desktop file now looks like this:
    [Desktop Entry]
    <syntaxhighlight lang="ini">
    ServiceTypes=image/*
    [Desktop Entry]
    Actions=setAsWallpaper;tileAsWallpaper
    Type=Service
    X-KDE-Submenu=Use As Wallpaper
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/*;
    [Desktop Action setAsWallpaper]
    Actions=setAsWallpaper;tileAsWallpaper;
    Name=Scaled
    X-KDE-Submenu=Use As Wallpaper
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6
    [Desktop Action tileAsWallpaper]
    Name=Tiled
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2
     
    Pretty simple, huh?
     
    === Cha-a-a-a-rge! ===
    Now it's time to strap on your imagination helmets: What sort of cool and useful servicemenus
    can you dream up? Open up a text editor and let the mayhem begin! Just don't forget
    to share the spoils of your adventures with the rest of us! ;-)


    [Desktop Action setAsWallpaper]
    Name=Scaled
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6


    ; About the Author
    [Desktop Action tileAsWallpaper]
    :''[mailto:[email protected] Aaron J. Seigo] is the immensely  proud father of a [http://olympusproject.org/~mhansen/seigo/gallery/index.php wonderful human being named Peyton]. Most everything else is pretty much secondary. ''
    Name=Tiled
    :''Of course this doesn't preclude the existence of significant [http://olympusproject.org/~mhansen peo][http://urbanlizard.com/~aseigo/reflectionsonly.jpg ple], [http://usability.kde.org pro][http://kdemyths.olympusproject.org jec][http://kt.zork.net/kde/ ts] and [http://www.kde.org code] in his life.''
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2
    </syntaxhighlight>

    Revision as of 23:12, 6 July 2011

    Note
    Part of this tutorial apply only to KDE3. Specially the dcop-part.


    The ability to select mimetype-specific actions from a KDE file manager's context menu is an often requested feature. The pleasant surprise is that this is already possible. The even more pleasant surprise is that you don't need to be a software developer to create new actions. This article details step-by-step how to quickly and easily add new actions to KDE file manager context menus.

    Introduction

    In KDE-speak a "servicemenu" is a special entry that appears in a context menu (or other context-based interface) for a file (or for directory), depending on the type of files that are selected.

    For example, if you have the KDE file archive utility Ark installed you will see a menu entry to "Extract here..." whenever you right click on a file archive. The option to "Extract here..." is a servicemenu.

    Creating new servicemenus is very simple, requiring nothing more than an idea and a text editor. You don't have to be a programmer or a KDE wizard to make them. In this tutorial we will be creating a set of actions that allows us to set an image as our desktop wallpaper just by right clicking on it and selecting "Use As Wallpaper". By the end of this tutorial you should be able to create your own servicemenus with ease.

    Where the Servicemenus Locate

    Servicemenus are defined using .desktop files, which are the same kind of files that are used to create entries in the K Menu or on the KDE desktop. These servicemenu files are found in $KDEHOME/share/services/ServiceMenus, the directory KDE was installed to or any directory listed in the $KDEDIRS environment variable.

    In the case of my home machine that means that servicemenu files can be found in the following places:

    /opt/kde4/share/services/ServiceMenus/
    /usr/share/services/ServiceMenus/
    /home/aaron/.kde4/share/kde4/services/ServiceMenus/
    
    Tip
    $KDEHOME defaults to ~/.kde when it isn't set or defined. You can find all the services directories by running
    kde4-config --path services
    
    from a Konsole window.


    The Start of Servicemenu

    We will begin creating our wallpaper servicemenu by choosing a name for the file: setAsWallpaper.desktop sounds good. The only thing that really matters with regards to the name is that it is unique and that it ends with .desktop. Next we'll open up the file in a text editor. The first thing we will put in the file is the "Desktop Entry" section:

    [Desktop Entry]
    Type=Service
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/png;image/jpeg;
    Actions=setAsWallpaper
    

    Every servicemenu file must have these four lines. Let's examine each of these lines one at a time.

    [Desktop Entry]
    

    KDE configuration files, including .desktop files, seperate the individual settings into sections. A section starts with a heading made up of letters, numbers and spaces in between square brackets on a line by itself. This first line means that all the options that follow, up until the next heading, belong to the "Desktop Entry" group.

    Type=Service
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/png;image/jpeg;
    

    The first line indicates that this .desktop file is of type Service; this is necessary since the default type is Application (i.e. something with an Exec line). Service is anything else, like plugins.

    The ServiceTypes entry refers to the type of plugin that this desktop file defines, and specifies that it is actually a Konqueror service menu.

    The MimeType line defines the type of file for which this servicemenu applies. You can define more than one mimetype by providing a list seperated by semicolons (but no spaces). In this case our servicemenu will show up when we select PNG or JPEG images. The File Associations control panel is a good place to look for mimetype definitions.

    Tip
    To create a servicemenu for directories use the
    inode/directory
    
    mimetype. To create a servicemenu for all files, use the base
    application/octet-stream
    
    mimetype.


    You can also specify an entire group of mimetypes using "typeglobs". To make our servicemenu apply not only to PNGs and JPEGs but to all images we would simply change the ServiceTypes entry to be:

    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/*;
    

    Now when we right click on any image file in Konqueror we can select it as our background.

    Actions=setAsWallpaper
    

    The Actions entry defines the actions we will create in our servicemenu. As with the ServiceTypes, you can define more than one action by using a semicolon separated list. Each of the actions listed will get a section of its own defining what that action does. In fact, that's our very next step.

    Creating an Action

    So far we have defined one action in our servicemenu file: setAsWallpaper. Now we need to define what that action looks like and what it actually does. We begin by adding a new heading to the end of our file:

    [Desktop Action setAsWallpaper]
    

    Note that it contains the setAsWallpaper action name. It is important to note that these files are case sensitive, so we need to watch the capitalization here. Now that we have a section for our action, let's give our action a name that the user will see.

    Name=Set As Background Image
    

    To translate the name, we add another Name entry followed by the language code. For instance, the Finnish translation for the "Set As Background Image" service is provided by an entry that looks like this:

    Name[fi]=Aseta taustakuvaksi
    

    Next let's add an icon:

    Icon=background
    

    Notice that we didn't include the .png file extension, but just referred to the icon by name. If we had left this line out our action would still work, it just wouldn't look as fancy. Now that we've achieved fancyness, let's finish up by making it useful:

    Exec=dcop kdesktop KBackgroundIface setWallpaper %u 6
    

    The Exec line defines what is run when the user selects the action from the menu. We can put any command we want there. The magic in this line is the "%u" which gets replaced with the URL of the image file before the command is run. If our command can accept more than one file at a time we can use "%U" instead. There are other special %values but %u and %U are probably the most useful for servicemenus.

    Our file now looks like this:

    [Desktop Entry]
    Type=Service
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/*;
    Actions=setAsWallpaper
    
    [Desktop Action setAsWallpaper]
    Name=Use As Wallpaper
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6
    

    If we save it and open up Konqueror, when we right click on a PNG, JPEG or GIF image we should now have a "Set as background" item in the menu. Try it out!

    Tip
    If you have a complex task that requires more than one command (for example if we wanted to copy the image file somewhere first and then use dcop to set it as the background) use a shell:
    Exec=/bin/sh -c ";<YOUR COMMANDS HERE>"


    And Now Back to Our Regularly Scheduled Broadcast...

    Back from the land of DCOP, we have produced a working servicemenu. Now what? We improve it, of course!

    Our current servicemenu scales the image to the size of the desktop and sets it as the wallpaper. But this isn't appropriate for wallpaper tiles which not be scaled but should be, well, tiled. So let's add an action for tiles. First we'll need to change the Actions line to say something like this:

    Actions=setAsWallpaper;tileAsWallpaper;
    

    Note the use of semicolons rather than commas in that line. Next, we'll add a new action section to the end of the file that looks something like this:

    [Desktop Action tileAsWallpaper]
    Name=Use As Wallpaper Tile
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2
    

    Note that "tileAsWallpaper" appears in the action section's heading. This is what tells Konqueror which action it is. In addition, we have a slightly different Name and a very slightly different Exec line. Now when we right click on an image we have another option, this time to tile the image across our desktop. We didn't even have to restart Konqueror, since it automatically rereads the file when it changes!

    KDE's desktop offers several background image options, of which Scale and Tile are just two. Of course if we start adding all those various background options, and then add those to all the other servicemenus that a typical KDE installation has it's easy to see how the Action menu can quickly get out of hand. Starting with KDE 3.2 we can create submenus for our servicemenus by adding a line like the following to the

    [Desktop Entry]
    

    group of the .desktop file:

    X-KDE-Submenu=Set As Background
    

    This will create a submenu called "Set As Background" and put all of the servicemenu's actions into it. Our servicemenu .desktop file now looks like this:

    [Desktop Entry]
    Type=Service
    ServiceTypes=KonqPopupMenu/Plugin
    MimeType=image/*;
    Actions=setAsWallpaper;tileAsWallpaper;
    X-KDE-Submenu=Use As Wallpaper
    
    [Desktop Action setAsWallpaper]
    Name=Scaled
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6
    
    [Desktop Action tileAsWallpaper]
    Name=Tiled
    Icon=background
    Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2