1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef CHROME_BROWSER_UI_LIBGTK2UI_GCONF_LISTENER_H_
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define CHROME_BROWSER_UI_LIBGTK2UI_GCONF_LISTENER_H_
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <gconf/gconf-client.h>
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <gtk/gtk.h>
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <set>
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <string>
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/basictypes.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/callback_forward.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_signal.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace libgtk2ui {
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class Gtk2UI;
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// On GNOME desktops, subscribes to the gconf key which controlls button order.
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Everywhere else, SetTiltebarButtons() just calls back into BrowserTitlebar
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// with the default ordering.
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass GConfListener {
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Sends data to the Gtk2UI when available.
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  explicit GConfListener(Gtk2UI* delegate);
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ~GConfListener();
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Called whenever the metacity key changes.
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CHROMEG_CALLBACK_2(GConfListener, void, OnChangeNotification,
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     GConfClient*, guint, GConfEntry*);
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void GetAndRegister(const char* key_to_subscribe,
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      const base::Callback<void(GConfValue*)>& initial_setter);
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Checks |error|. On error, prints out a message and closes the connection
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // to GConf and reverts to default mode.
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool HandleGError(GError* error, const char* key);
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Parses the return data structure from GConf, falling back to the default
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // value on any error.
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void ParseAndStoreButtonValue(GConfValue* gconf_value);
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void ParseAndStoreMiddleClickValue(GConfValue* gconf_value);
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Gtk2UI* delegate_;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Pointer to our gconf context. NULL if we aren't on a desktop that uses
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // gconf.
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  GConfClient* client_;
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DISALLOW_COPY_AND_ASSIGN(GConfListener);
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace libgtk2ui
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif  // CHROME_BROWSER_UI_LIBGTK2UI_GCONF_LISTENER_H_
59