Fluxbox code anpassen C++

Laberkopf

New member
Themenstarter
Registriert
12 Aug. 2011
Beiträge
834
Hallo allerseits,

nachdem selbst die Fluxbox Entwickler im IRC entweder keine Lust haben oder es selber nicht wissen, wollte ich mal schauen, ob hier jemand ist, der den Code versteht.

Konkret geht es um folgendes:

Momentan nutze ich Pypanel. Dies ist schon alt und glitcht nur noch rum. Das schöne daran ist jedoch, dass ich mit einem Linksklick auf den Arbeitsflächennamen Links in der Leiste zur linken Arbeitsfläche wechseln kann, sowie mit einem Rechtsklick zur rechten Arbeitsfläche.

Bei dem Fluxbox Panel ist dies nun so, dass neben dem Namen der Arbeitsfläche Pfeile sind.

Ich hätte nun gerne das Links/Rechtsklick feature vom Pypanel im normalen Fluxbox Panel.

Im Code finde ich leider nicht wo definiert wird was die Pfeile tun beim Klick. (Generell erscheint mir der Code recht wirr.)


Für das was ich bezwecken will gibt es KEINE Einstellung in der Konfigurationsdatei. Eine Codeanpassung ist somit unumgänglich. (Klingt beschissen, aber musste ich jetzt schon X mal sagen. :facepalm:)


Vielleicht ist hier ja jemand erleuchteter was den Code angeht...

Dort ist der Tarball: http://sourceforge.net/projects/fluxbox/files/fluxbox/1.3.2/fluxbox-1.3.2.tar.gz

Laberkopf
 
Hi,
Ich versuch's mal ;)

Im Code finde ich leider nicht wo definiert wird was die Pfeile tun beim Klick. (Generell erscheint mir der Code recht wirr.)
Zusammenfassung (Herleitung weiter unten):
Die Erstellung der einzelnen Toolbarelemente erfolgt in ToolFactory.cc, Z. 73ff.. Wenn ich dich richtig verstanden habe, möchtest du die {prev,next}workspace-Funktionalität (Z93f., "else"-Block") in das "workspaces"-Element einbauen. Dazu kannst du entweder den vorhandenen "if ... workspacename"-Block (Z.80f.) ändern, oder einen neuen if-Block anlegen (ggf. weitere Änderungen nötig, damit der Block tatsächlich erreichbar ist!):

Code:
// src/ToolFactory.cc, Z79f.
if (name == "workspacename" ) {
   ...
} else if (name == "NEW_workspacename" ) { /* "beliebiger" Name */
   /* code vom workspacename-if-Block kopiert und angepasst
   ** + onClick-Aktionen mit den Kommandos vom else-Block
   */
  ...
} else if ....

(knappe) Herleitung der Pfeil-Aktionen:
Code:
src/Toolbar.cc:

Z.184ff., Toolbar Konstruktur ("Toolbar-Objekt"), insbesondere Z.225,
 Definition/Konfiguration des Toolbar-Inhalts (FbTk::Resource<string> m_rc_tools)
=> Z.385 bis ~434 -- Konstruktion der (eigentlichen) Toolbar,
   insbesondere Z.421: Toolbar-Inhalte werden erschaffen (als ToolbarItem(s),
   zusammengefasst in m_item_list, erstellt via ToolFactory m_tool_factory)

=> src/ToolFactory.cc:

Z. 73 ff. create(...) -- Erstellung von ToolbarItem(s),
 u.a. "Auflisting" (new <...>) der spezifischen ToolbarItem-Klassen

hier interessant: der else-block Z 93-116,
die prev-/nextworkspace-Aktion wird dann mittels FbTk::CommandParser erstellt

=> src/FbTk/CommandParser.hh:
Z 97 parse#2(...) -> ... -> Z114 lookup(...) => nach REGISTER_-Aufrufen suchen

=> src/WorkspaceCmd.cc:
Z 324-329 REGISTER_COMMAND_PARSER {next,prev,right,left,}workspace
=> Z 306 Erstellung der eigentlichen Aktionen:
   * NextWorkspaceCmd(...)
   * PrevWorkSpaceCmd(...)


==>
gewuenschtes Kommando via CommandParser erhalten (siehe src/ToolFactory.cc Z.100)
und dann einrichten (ToolFactory.cc Z.80f. im 'if ... "workspacename"'-Block)

vg,
dywi
 
Es ist immer wieder schön zu sehen wie schnell man hier im Forum nicht nur eine Antwort, sondern DIE Antwort bekommt. (Und dass um 3:47)

Vielen vielen Dank. Jetzt hab ich es endlich verstanden.

Ich habe nun die FbTk/Button.hh und FbTk/Button.cc angepasst, sodass es auch ein setonrightclick gibt.

Code:
Button.hh Ab Z.44

   /// sets action when the button is clicked with #button mouse btn
    void setOnClick(RefCount<Command<void> > &com, int button = 1);
    /// Right Mousebutton Action
    void setOnRightClick(RefCount<Command<void> > &com, int button = 3);
Code:
Button.cc Ab Z.67

void Button::setOnClick(RefCount<Command<void> > &cmd, int button) {
    // we only handle buttons 1 to 5
    if (button > 5 || button == 0)
        return;
    //set on click command for the button
    m_onclick[button - 1] = cmd;
}
void Button::setOnRightClick(RefCount<Command<void> > &cmd, int button) {
    // we only handle buttons 1 to 5
    if (button > 5 || button == 0)
        return;
    //set on click command for the button
    m_onclick[button - 3] = cmd;
}


Nun wollte ich auch noch das workspacename in Toolfactory.cc anpassen. Da hänge ich grad aber.
Code:
Toolfactory.cc Ab Z.80

   if (name == "workspacename") {
        WorkspaceNameTool *witem = new WorkspaceNameTool(parent,
                                                        *m_workspace_theme, screen());
        using namespace FbTk;
        RefCount<Command<void> > showmenu(new ShowMenuAboveToolbar(tbar));
        witem->button().setOnClick("new LeftWorkspaceCmd(num)");
	witem->button().setOnRightClick("new RightWorkspaceCmd(num)");
        item = witem;

Der Compiler spuckt nur

Code:
ToolFactory.cc: In member function ‘ToolbarItem* ToolFactory::create(const string&, const FbTk::FbWindow&, Toolbar&)’:
ToolFactory.cc:85:63: error: no matching function for call to ‘FbTk::Button::setOnClick(const char [26])’
ToolFactory.cc:85:63: note: candidate is:
In file included from FbTk/TextButton.hh:25:0,
                 from ClockTool.hh:30,
                 from ToolFactory.cc:26:
FbTk/Button.hh:45:10: note: void FbTk::Button::setOnClick(FbTk::RefCount<FbTk::Command<void> >&, int)
FbTk/Button.hh:45:10: note:   no known conversion for argument 1 from ‘const char [26]’ to ‘FbTk::RefCount<FbTk::Command<void> >&’
ToolFactory.cc:86:62: error: no matching function for call to ‘FbTk::Button::setOnRightClick(const char [27])’
ToolFactory.cc:86:62: note: candidate is:
In file included from FbTk/TextButton.hh:25:0,
                 from ClockTool.hh:30,
                 from ToolFactory.cc:26:
FbTk/Button.hh:47:10: note: void FbTk::Button::setOnRightClick(FbTk::RefCount<FbTk::Command<void> >&, int)
FbTk/Button.hh:47:10: note:   no known conversion for argument 1 from ‘const char [27]’ to ‘FbTk::RefCount<FbTk::Command<void> >&’

aus. Jetzt noch da ein kleiner Hinweis und es ist perfekt. :)
 
Äh, sollte das
Code:
witem->button().setOnClick("new LeftWorkspaceCmd(num)"); 
witem->button().setOnRightClick("new RightWorkspaceCmd(num)");

nicht eher
Code:
witem->button().setOnClick(new LeftWorkspaceCmd(num)); 
witem->button().setOnRightClick(new RightWorkspaceCmd(num));
sein?
Oder wieso übergibst du einen String?
 
Weil ich wirr bin wie mir scheint. ^^ Jetzt haben wir immerhin neue Errors. :D

Code:
ToolFactory.cc: In member function ‘ToolbarItem* ToolFactory::create(const string&, const FbTk::FbWindow&, Toolbar&)’:ToolFactory.cc:85:40: error: expected type-specifier before ‘LeftWorkspaceCmd’
ToolFactory.cc:85:40: error: expected ‘)’ before ‘LeftWorkspaceCmd’
ToolFactory.cc:85:61: error: no matching function for call to ‘FbTk::Button::setOnClick(int*)’
ToolFactory.cc:85:61: note: candidate is:
In file included from FbTk/TextButton.hh:25:0,
                 from ClockTool.hh:30,
                 from ToolFactory.cc:26:
FbTk/Button.hh:45:10: note: void FbTk::Button::setOnClick(FbTk::RefCount<FbTk::Command<void> >&, int)
FbTk/Button.hh:45:10: note:   no known conversion for argument 1 from ‘int*’ to ‘FbTk::RefCount<FbTk::Command<void> >&’
ToolFactory.cc:86:38: error: expected type-specifier before ‘RightWorkspaceCmd’
ToolFactory.cc:86:38: error: expected ‘)’ before ‘RightWorkspaceCmd’
ToolFactory.cc:86:60: error: no matching function for call to ‘FbTk::Button::setOnRightClick(int*)’
ToolFactory.cc:86:60: note: candidate is:
In file included from FbTk/TextButton.hh:25:0,
                 from ClockTool.hh:30,
                 from ToolFactory.cc:26:
FbTk/Button.hh:47:10: note: void FbTk::Button::setOnRightClick(FbTk::RefCount<FbTk::Command<void> >&, int)
FbTk/Button.hh:47:10: note:   no known conversion for argument 1 from ‘int*’ to ‘FbTk::RefCount<FbTk::Command<void> >&’
 
Ok, um die Fehlermeldung zu interpretieren: Du übergibst einen int-Pointer, es wird aber eine RefCount-Objekt erwartet (wie ja auch oben in der Signatur der Funktion steht).
Um einen konkreten Ratschlag zu geben, müsste ich mir jetzt mal mehr Code ansehen, zumal meine C++-Kenntnisse auch begrenzt sind.
Gibt es evtl. noch eine andere Stelle, an der setOnClick gerufen wird, von der du dir anschauen kannst, was du genau übergeben musst?
 
Ja, in der Window.cc in der Nähe von Z. 3531

Da werd ich aber auch nicht draus schlau. Ich kann eigentlich gar kein C++. Meine Programmierkünste beschränken sich auf Selbstverteidigung. :D
 
Versuchs mal mit
Code:
RefCount<Command<void>> leftCommand(new LeftWorkspaceCmd(num));
RefCount<Command<void>> rightCommand(new RightWorkspaceCmd(num));

witem->button().setOnClick(leftCommand); 
witem->button().setOnRightClick(rightCommand);
 
Klingt logisch. Gibt jetzt wieder andere Fehler. :>

Code:
ToolFactory.cc: In member function ‘ToolbarItem* ToolFactory::create(const string&, const FbTk::FbWindow&, Toolbar&)’:
ToolFactory.cc:85:43: error: expected type-specifier before ‘LeftWorkspaceCmd’
ToolFactory.cc:85:43: error: expected ‘)’ before ‘LeftWorkspaceCmd’
ToolFactory.cc:85:64: error: no matching function for call to ‘FbTk::RefCount<FbTk::Command<void> >::RefCount(int*)’
ToolFactory.cc:85:64: note: candidates are:
In file included from FbTk/Signal.hh:25:0,
                 from FbTk/Theme.hh:29,
                 from FbTk/TextTheme.hh:26,
                 from ToolTheme.hh:26,
                 from ToolFactory.hh:25,
                 from ToolFactory.cc:22:
FbTk/RefCount.hh:69:1: note: template<class Pointer2> FbTk::RefCount::RefCount(const FbTk::RefCount<Pointer2>&)
FbTk/RefCount.hh:69:1: note:   template argument deduction/substitution failed:
ToolFactory.cc:85:64: note:   mismatched types ‘const FbTk::RefCount<Pointer>’ and ‘int*’
In file included from FbTk/Signal.hh:25:0,
                 from FbTk/Theme.hh:29,
                 from FbTk/TextTheme.hh:26,
                 from ToolTheme.hh:26,
                 from ToolFactory.hh:25,
                 from ToolFactory.cc:22:
FbTk/RefCount.hh:81:1: note: FbTk::RefCount<Pointer>::RefCount(const FbTk::RefCount<Pointer>&) [with Pointer = FbTk::Command<void>]
FbTk/RefCount.hh:81:1: note:   no known conversion for argument 1 from ‘int*’ to ‘const FbTk::RefCount<FbTk::Command<void> >&’
FbTk/RefCount.hh:76:1: note: FbTk::RefCount<Pointer>::RefCount(Pointer*) [with Pointer = FbTk::Command<void>]
FbTk/RefCount.hh:76:1: note:   no known conversion for argument 1 from ‘int*’ to ‘FbTk::Command<void>*’
FbTk/RefCount.hh:63:1: note: FbTk::RefCount<Pointer>::RefCount() [with Pointer = FbTk::Command<void>]
FbTk/RefCount.hh:63:1: note:   candidate expects 0 arguments, 1 provided
ToolFactory.cc:86:44: error: expected type-specifier before ‘RightWorkspaceCmd’
ToolFactory.cc:86:44: error: expected ‘)’ before ‘RightWorkspaceCmd’
ToolFactory.cc:86:66: error: no matching function for call to ‘FbTk::RefCount<FbTk::Command<void> >::RefCount(int*)’
ToolFactory.cc:86:66: note: candidates are:
In file included from FbTk/Signal.hh:25:0,
                 from FbTk/Theme.hh:29,
                 from FbTk/TextTheme.hh:26,
                 from ToolTheme.hh:26,
                 from ToolFactory.hh:25,
                 from ToolFactory.cc:22:
FbTk/RefCount.hh:69:1: note: template<class Pointer2> FbTk::RefCount::RefCount(const FbTk::RefCount<Pointer2>&)
FbTk/RefCount.hh:69:1: note:   template argument deduction/substitution failed:
ToolFactory.cc:86:66: note:   mismatched types ‘const FbTk::RefCount<Pointer>’ and ‘int*’
In file included from FbTk/Signal.hh:25:0,
                 from FbTk/Theme.hh:29,
                 from FbTk/TextTheme.hh:26,
                 from ToolTheme.hh:26,
                 from ToolFactory.hh:25,
                 from ToolFactory.cc:22:
FbTk/RefCount.hh:81:1: note: FbTk::RefCount<Pointer>::RefCount(const FbTk::RefCount<Pointer>&) [with Pointer = FbTk::Command<void>]
FbTk/RefCount.hh:81:1: note:   no known conversion for argument 1 from ‘int*’ to ‘const FbTk::RefCount<FbTk::Command<void> >&’
FbTk/RefCount.hh:76:1: note: FbTk::RefCount<Pointer>::RefCount(Pointer*) [with Pointer = FbTk::Command<void>]
FbTk/RefCount.hh:76:1: note:   no known conversion for argument 1 from ‘int*’ to ‘FbTk::Command<void>*’
FbTk/RefCount.hh:63:1: note: FbTk::RefCount<Pointer>::RefCount() [with Pointer = FbTk::Command<void>]
FbTk/RefCount.hh:63:1: note:   candidate expects 0 arguments, 1 provided
 
Ok, was dywi oben schrieb, macht Sinn. Wir verwenden mal die Commands, die der CommandParser vorhält.
Code:
RefCount<Command<void>> leftCommand(FbTk::CommandParser<void>::instance().parse("leftworkspace"));
RefCount<Command<void>> rightCommand(FbTk::CommandParser<void>::instance().parse("rightworkspace"));
 
Okay, es kompiliert. Leider tut es nur nicht das was ich will. :D Linksklick auf den Namen geht eine Arbeitsfläche nach Rrechts und Rechtsklick öffnet das Kontextmenu. Da ist meine Rechtsklickgeschichte wohl falsch. :/ Hast du da auch noch ne Lösung für? ^^ (Zudem geht es am Ende nicht wieder an den Anfang. Also Wenn Ganz Rechts dann zur 1. Links)
 
Wenn ich das event-handling des Buttons richtig verstehe, hast du einen Fehler in der Methode
Button::setOnRightClick, bzw. der Zeile
Code:
m_onclick[button - 3] = cmd;

Da die Variable button 3 ist (als default-Parameter), wird das Command an die Stelle 0 in den Array m_onclick geschrieben.
Hier überschreibt es dann allerdings die Aktion des normalen Klicks, die wir ja vorher gesetzt haben. Das erklärt dann auch das Rechtsklickverhalten bei Linksklick.

Da Button::setOnClick noch optional einen Button-Parameter entgegennimmt, brauchst die Methode Button::setOnRightClick
gar nicht mehr, und kannst das Rechtsklick-Event einfach mit

Code:
witem->button().setOnClick(rightCommand, 3);

registrieren. Dann wird das Rechtsklickcommand an die Stelle 2 im Array, und damit hoffentlich an die richtige Stelle geschrieben.
Ich hoffe, das bringt dich weiter und werde mich nun erstmal um die letzten Weihnachtsgeschenke kümmern. :D
 
Das funktioniert. Zum cyclen musste ich nur das left und right durch prev und next ersetzen. Jetzt muss ich nur noch das Rightclick Menu aus der Toolbar entfernen.

Danke!

Edith sagt:

Toolbar.cc Z. 511ff

Code:
void Toolbar::buttonPressEvent(XButtonEvent &be) {    if (Fluxbox::instance()->keys()->doAction(be.type, be.state, be.button,
                                              Keys::ON_TOOLBAR, 0, be.time))
        return;


    if (be.button == 1)
        raise();
    if (be.button != 2)
        return;


    screen()
        .placementStrategy()
        .placeAndShowMenu(menu(), be.x_root, be.y_root, false);
}

Jetzt öffnet der Mittelklick das menu. Alles so wie ich es wollte. Ich danke!
 
Zuletzt bearbeitet:
  • ok1.de
  • thinkstore24.de
  • ok2.de - Notebook Computer Server
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben