source: proiecte/PPPP/gdm/gui/user-switch-applet/gdm-entry-menu-item.c @ 134

Last change on this file since 134 was 134, checked in by (none), 14 years ago

gdm sources with the modifications for webcam

File size: 8.8 KB
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2008 Red Hat, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20#include "config.h"
21
22#include <unistd.h>
23#include <sys/types.h>
24
25#include <string.h>
26
27#include <glib/gi18n.h>
28#include <gtk/gtk.h>
29
30#include "gdm-entry-menu-item.h"
31
32/* same as twitter */
33#define TEXT_BUFFER_MAX_CHARS 64
34
35enum
36{
37        PROP_0,
38};
39
40struct _GdmEntryMenuItem
41{
42        GtkMenuItem      parent;
43
44        GtkWidget       *hbox;
45        GtkWidget       *image;
46        GtkWidget       *entry;
47};
48
49struct _GdmEntryMenuItemClass
50{
51        GtkMenuItemClass parent_class;
52};
53
54G_DEFINE_TYPE (GdmEntryMenuItem, gdm_entry_menu_item, GTK_TYPE_MENU_ITEM)
55
56static void
57gdm_entry_menu_item_set_property (GObject      *object,
58                                  guint         param_id,
59                                  const GValue *value,
60                                  GParamSpec   *pspec)
61{
62        GdmEntryMenuItem *item;
63
64        item = GDM_ENTRY_MENU_ITEM (object);
65
66        switch (param_id) {
67        default:
68                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
69                break;
70        }
71}
72
73static void
74gdm_entry_menu_item_get_property (GObject    *object,
75                                  guint       param_id,
76                                  GValue     *value,
77                                  GParamSpec *pspec)
78{
79        GdmEntryMenuItem *item;
80
81        item = GDM_ENTRY_MENU_ITEM (object);
82
83        switch (param_id) {
84        default:
85                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
86                break;
87        }
88}
89
90static void
91gdm_entry_menu_item_dispose (GObject *object)
92{
93
94        (*G_OBJECT_CLASS (gdm_entry_menu_item_parent_class)->dispose) (object);
95}
96
97static gboolean
98gdm_entry_menu_item_button_release (GtkWidget      *widget,
99                                    GdkEventButton *event)
100{
101        return TRUE;
102}
103
104/* Cut and paste from gtkwindow.c */
105static void
106send_focus_change (GtkWidget *widget,
107                   gboolean   in)
108{
109        GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
110
111        g_object_ref (widget);
112
113        if (in) {
114                GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
115        } else {
116                GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
117        }
118
119        fevent->focus_change.type = GDK_FOCUS_CHANGE;
120        fevent->focus_change.window = g_object_ref (widget->window);
121        fevent->focus_change.in = in;
122
123        gtk_widget_event (widget, fevent);
124
125        g_object_notify (G_OBJECT (widget), "has-focus");
126
127        g_object_unref (widget);
128        gdk_event_free (fevent);
129}
130
131static gboolean
132gdm_entry_menu_item_button_press (GtkWidget      *widget,
133                                  GdkEventButton *event)
134{
135        GtkWidget *entry;
136
137        entry = GDM_ENTRY_MENU_ITEM (widget)->entry;
138
139        if (entry->window != NULL) {
140                gdk_window_raise (entry->window);
141        }
142
143        if (!GTK_WIDGET_HAS_FOCUS (entry)) {
144                gtk_widget_grab_focus (entry);
145        }
146
147        return FALSE;
148}
149
150static void
151gdm_entry_menu_item_realize (GtkWidget *widget)
152{
153        if (GTK_WIDGET_CLASS (gdm_entry_menu_item_parent_class)->realize) {
154                GTK_WIDGET_CLASS (gdm_entry_menu_item_parent_class)->realize (widget);
155        }
156}
157
158static void
159gdm_entry_menu_item_select (GtkItem *item)
160{
161        g_return_if_fail (GDM_IS_ENTRY_MENU_ITEM (item));
162        send_focus_change (GTK_WIDGET (GDM_ENTRY_MENU_ITEM (item)->entry), TRUE);
163}
164
165static void
166gdm_entry_menu_item_deselect (GtkItem *item)
167{
168        g_return_if_fail (GDM_IS_ENTRY_MENU_ITEM (item));
169
170        send_focus_change (GTK_WIDGET (GDM_ENTRY_MENU_ITEM (item)->entry), FALSE);
171}
172
173static void
174gdm_entry_menu_item_class_init (GdmEntryMenuItemClass *klass)
175{
176        GObjectClass     *gobject_class;
177        GtkWidgetClass   *widget_class;
178        GtkMenuItemClass *menu_item_class;
179        GtkItemClass     *item_class;
180
181        gobject_class = G_OBJECT_CLASS (klass);
182        widget_class = GTK_WIDGET_CLASS (klass);
183        menu_item_class = GTK_MENU_ITEM_CLASS (klass);
184        item_class = GTK_ITEM_CLASS (klass);
185
186        gobject_class->set_property = gdm_entry_menu_item_set_property;
187        gobject_class->get_property = gdm_entry_menu_item_get_property;
188        gobject_class->dispose = gdm_entry_menu_item_dispose;
189
190        widget_class->button_release_event = gdm_entry_menu_item_button_release;
191        widget_class->button_press_event = gdm_entry_menu_item_button_press;
192        widget_class->realize = gdm_entry_menu_item_realize;
193
194        item_class->select = gdm_entry_menu_item_select;
195        item_class->deselect = gdm_entry_menu_item_deselect;
196
197        menu_item_class->hide_on_activate = FALSE;
198}
199
200static void
201on_entry_show (GtkWidget        *widget,
202               GdmEntryMenuItem *item)
203{
204        if (widget->window != NULL) {
205                gdk_window_raise (widget->window);
206        }
207        send_focus_change (widget, TRUE);
208}
209
210static void
211on_text_buffer_changed (GtkTextBuffer    *buffer,
212                        GdmEntryMenuItem *item)
213{
214        int len;
215
216        len = gtk_text_buffer_get_char_count (buffer);
217        if (len > TEXT_BUFFER_MAX_CHARS) {
218                gdk_window_beep (GTK_WIDGET (item)->window);
219        }
220}
221
222static void
223on_entry_move_focus (GtkWidget        *widget,
224                     GtkDirectionType  direction,
225                     GdmEntryMenuItem *item)
226{
227        g_debug ("focus move");
228        send_focus_change (GTK_WIDGET (GDM_ENTRY_MENU_ITEM (item)->entry), FALSE);
229        g_signal_emit_by_name (item,
230                               "move-focus",
231                               GTK_DIR_TAB_FORWARD);
232}
233
234static void
235gdm_entry_menu_item_init (GdmEntryMenuItem *item)
236{
237        PangoFontDescription *fontdesc;
238        PangoFontMetrics     *metrics;
239        PangoContext         *context;
240        PangoLanguage        *lang;
241        int                   ascent;
242        GtkTextBuffer        *buffer;
243
244        item->hbox = gtk_hbox_new (FALSE, 6);
245        gtk_container_add (GTK_CONTAINER (item), item->hbox);
246
247        item->image = gtk_image_new ();
248        gtk_box_pack_start (GTK_BOX (item->hbox), item->image, FALSE, FALSE, 0);
249
250        item->entry = gtk_text_view_new ();
251        gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (item->entry), FALSE);
252        gtk_text_view_set_editable (GTK_TEXT_VIEW (item->entry), TRUE);
253        gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (item->entry),
254                                     GTK_WRAP_WORD);
255        g_signal_connect (item->entry,
256                          "show",
257                          G_CALLBACK (on_entry_show),
258                          item);
259        g_signal_connect (item->entry,
260                          "move-focus",
261                          G_CALLBACK (on_entry_move_focus),
262                          item);
263
264        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (item->entry));
265        g_signal_connect (buffer,
266                          "changed",
267                          G_CALLBACK (on_text_buffer_changed),
268                          item);
269
270        /* get the font ascent for the current font and language */
271        context = gtk_widget_get_pango_context (item->entry);
272        fontdesc = pango_context_get_font_description (context);
273        lang = pango_context_get_language (context);
274        metrics = pango_context_get_metrics (context, fontdesc, lang);
275        ascent = pango_font_metrics_get_ascent (metrics) * 1.5 / PANGO_SCALE;
276        pango_font_metrics_unref (metrics);
277
278        /* size our progress bar to be five ascents long */
279        gtk_widget_set_size_request (item->entry, ascent * 5, -1);
280
281        gtk_box_pack_start (GTK_BOX (item->hbox), item->entry, TRUE, TRUE, 0);
282
283        gtk_widget_show (item->hbox);
284        gtk_widget_show (item->image);
285        gtk_widget_show (item->entry);
286}
287
288GtkWidget *
289gdm_entry_menu_item_new (void)
290{
291        return g_object_new (GDM_TYPE_ENTRY_MENU_ITEM, NULL);
292}
293
294GtkWidget *
295gdm_entry_menu_item_get_entry (GdmEntryMenuItem *item)
296{
297        g_return_val_if_fail (GDM_IS_ENTRY_MENU_ITEM (item), NULL);
298
299        return item->entry;
300}
301
302GtkWidget *
303gdm_entry_menu_item_get_image (GdmEntryMenuItem *item)
304{
305        g_return_val_if_fail (GDM_IS_ENTRY_MENU_ITEM (item), NULL);
306
307        return item->image;
308}
Note: See TracBrowser for help on using the repository browser.