Hi Dileep,

that's quite a lot. I don't have enough continuous time to answer all at once, so I just start with the first two questions.
@all: Everybody is very welcome to join discussion and answering:)

Am 18.05.2018 17:04 schrieb Dileep Sankhla:
I have few things to ask before getting it done and it would be nice
if you can reply to any of the queries with your own suggestions.

1. In tree/ui/data/tools.xml, we have decided to append new
"typewriter" annotation tool at <tool id="10"> without muddling
others. Now should I give <shortcut>0</shortcut> to this tool or
should I ommit the <shortcut> tag completely for this one?
Giving shortcut 0 makes sense as 0 is the key next to 9 on the
keyboard but having shortcut 0 for the tool at the lowest end in the
annotation toolbar doesn't make sense.

Imho either 0 or none would both make sense. Users can configure the toolbar and shortcuts themselves anyway.

2. My mentor remarked that tools.xml doesn't solely determine the
order in the toolbar. It is just the initial default, but the
"okularpartrc" file, if present, takes precedence.
It is located at ~/.config/okularpartrc on my system containing the
content similar to tools.xml. I need to know when it is being created
and read by okular and how do I append typewriter tool entry in it for
every system installing okular? I have no idea.

When toolbar accesses Okular::Settings::annotationTools, values are already in memory. But you'll ask, how and when have they come there?

class Okular::Settings is defined in <cmake-project-dir>/settings.cpp. You must know that settings.{cpp,h} is autogenerated during project build by kconfig_compiler_kf5 out of conf/okular.kcfg. Please read [0] to learn about this. The responsible macro is in okular/CMakeLists.txt kconfig_add_kcfg_files(okularpart_SRCS conf/settings.kcfgc).

Data for Okular::Settings is initialized once in Okular::Settings::Settings Ctor. There the file tools.xml is read, as coded into the <entry key="AnnotationTools" type="StringList"><code>...</code></entry> element from okular.kcfg.

Data for Okular::Settings is also loaded and saved via a KSharedConfig config object. KSharedConfig derives from KConfig, and KConfig::reparseConfiguration [1] loads data from ~/.config/okularpartrc.

Sadly there are several KSharedConfig instances in Okular, so if we want to watch it in gdb, we have to figure out during runtime which KSharedConfig is responsible for ~/.config/okularpartrc.

Be sure to have libKF5ConfigCore debug symbols around (on Ubuntu: apt-get install libkf5configcore5-dbgsym).

$ gdb okular

(gdb) set breakpoint pending on
(gdb) break Okular::Settings::Settings

Next set a specific breakpoint to filter for the interesting KSharedConfig object. We know that if KSharedConfig Ctor is called inside Okular::Settings::instance, it is the one responsible for ~/.config/okularpartrc. So break only in this condition.

(gdb) break Okular::Settings::instance
command 1
  tb KSharedConfig::KSharedConfig
  c
end

Run the program.

(gdb) r

When hit, we know the KSharedConfig object of interest.
#0 KSharedConfig::KSharedConfig (this=0x55555588f310, fileName=..., flags=..., resType=QStandardPaths::GenericConfigLocation)
    at ./src/core/ksharedconfig.cpp:124

It is at 0x55555588f310. Now we can set another conditional breakpoint to catch the KConfig::reparseConfiguration calls of interest.

(gdb) break KConfig::reparseConfiguration if this=0x55555588f310

That's it.
Everytime you hit Okular::Settings::Settings, Okular reads from tools.xml. Everytime you hit this KConfig::reparseConfiguration, Okular reads from ~/.config/okularpartrc.

Can you share your observations?

To gain even more convidence in your debugging it's sometimes good to observe the value of QStrings. KDE provides nice tools for this:

$ git clone git://anongit.kde.org/kde-dev-scripts.git
$ cp kde-dev-scripts/kde-devel-gdb ~/.gdbinit
$ gdb okular

Break somewhere. Now you can use the printq5string function to print the content of a QString:

Thread 1 "okular" hit Breakpoint 2, Okular::Settings::instance (cfgfilename=...) at ./obj-x86_64-linux-gnu/settings.cpp:189 189 ./obj-x86_64-linux-gnu/settings.cpp: Datei oder Verzeichnis nicht gefunden.

(gdb) printq5string cfgfilename
/home/tobias/.config/okularpartrc

Cheers
Tobias

[0] https://api.kde.org/frameworks/kconfig/html/kconfig_compiler.html
[1] https://api.kde.org/frameworks/kconfig/html/classKConfig.html#a46f2e340c44261c2b58496bc64b31106

Reply via email to