1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2004 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
23 #include "pollcreator.h"
26 #include "usejournal.h"
31 #include "html_markup.h"
45 ACTION_ENTRY_SUBMIT_SEP
,
46 ACTION_ENTRY_SUBMIT_NEW
,
47 ACTION_ENTRY_SAVE_SERVER
,
50 /* these must match JamViewMeta in meta.h. */
58 ACTION_VIEW_PREFORMATTED
,
61 ACTION_VIEW_SCREENING
,
65 ACTION_JOURNAL_USE_SEP
,
72 void about_dlg(GtkWidget
*mainwin
);
73 static void menu_account_changed(JamWin
*jw
);
76 menu_make_link(JamWin
*jw
) {
77 void link_dialog_run(GtkWindow
*win
, JamDoc
*doc
);
78 link_dialog_run(GTK_WINDOW(jw
), jw
->doc
);
81 menu_make_journal_link(JamWin
*jw
) {
82 void link_journal_dialog_run(GtkWindow
*win
, JamDoc
*doc
);
83 link_journal_dialog_run(GTK_WINDOW(jw
), jw
->doc
);
86 menu_insert_image(JamWin
*jw
) {
87 void image_dialog_run(GtkWindow
*win
, JamDoc
*doc
);
88 image_dialog_run(GTK_WINDOW(jw
), jw
->doc
);
93 if (!jam_confirm_lose_entry(jw
)) return;
97 load_last_entry(JamWin
*jw
) {
100 if (!jam_confirm_lose_entry(jw
)) return;
102 entry
= history_load_latest(GTK_WINDOW(jw
), jw
->account
, jam_doc_get_usejournal(jw
->doc
));
106 jam_doc_load_entry(jw
->doc
, entry
);
107 lj_entry_free(entry
);
108 undomgr_reset(UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw
->view
))));
111 run_history_recent_dlg(JamWin
*jw
) {
114 if (!jam_confirm_lose_entry(jw
)) return;
116 if ((entry
= history_recent_dialog_run(GTK_WINDOW(jw
), jw
->account
, jam_doc_get_usejournal(jw
->doc
))) == NULL
)
119 jam_doc_load_entry(jw
->doc
, entry
);
120 lj_entry_free(entry
);
121 undomgr_reset(UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw
->view
))));
125 run_offline_dlg(JamWin
*jw
) {
126 LJEntry
*offline_dlg_run(GtkWindow
*, JamAccount
*);
129 if (!jam_confirm_lose_entry(jw
)) return;
131 if ((entry
= offline_dlg_run(GTK_WINDOW(jw
), jw
->account
)) == NULL
)
134 jam_doc_load_entry(jw
->doc
, entry
);
135 lj_entry_free(entry
);
136 undomgr_reset(UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw
->view
))));
139 static void menu_save(JamWin
*jw
) { jam_save(jw
); }
140 static void menu_save_as_file(JamWin
*jw
) { jam_save_as_file(jw
); }
141 static void menu_save_as_draft(JamWin
*jw
) { jam_save_as_draft(jw
); }
144 menu_view_cb(JamWin
*jw
, int action
, GtkCheckMenuItem
*item
) {
145 JamView
*view
= jam_win_get_cur_view(jw
);
146 JamViewMeta meta
= (JamViewMeta
)(action
- ACTION_VIEW_FIRST
);
149 show
= gtk_check_menu_item_get_active(item
);
150 conf
.options
.showmeta
[meta
] = show
;
151 jam_view_toggle_meta(view
, meta
, show
);
155 meta_toggle_cb(JamView
*view
, JamViewMeta meta
, gboolean show
, JamWin
*jw
) {
156 GtkCheckMenuItem
*item
;
159 item
= GTK_CHECK_MENU_ITEM(
160 gtk_item_factory_get_item_by_action(jw
->factory
,
161 ACTION_VIEW_FIRST
+meta
));
163 /* don't let view-activated meta changes
164 * actually change the user's meta prefs. */
165 oldmeta
= conf
.options
.showmeta
[meta
];
166 gtk_check_menu_item_set_active(item
, show
);
167 conf
.options
.showmeta
[meta
] = oldmeta
;
172 security_cb(JamWin
*jw
, int action
, GtkCheckMenuItem
*item
) {
173 LJSecurity sec
= jam_doc_get_security(jw
->doc
);
175 if (!gtk_check_menu_item_get_active(item
))
178 sec
.type
= action
- ACTION_ENTRY_SECURITY_PUBLIC
;
179 if (sec
.type
== LJ_SECURITY_CUSTOM
) {
180 sec
.allowmask
= custom_security_dlg_run(GTK_WINDOW(jw
),
181 sec
.allowmask
, JAM_ACCOUNT_LJ(jw
->account
));
182 /* if they didn't include anyone, it's a private entry. */
183 if (sec
.allowmask
== 0)
184 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
185 gtk_item_factory_get_widget_by_action(jw
->factory
,
186 ACTION_ENTRY_SECURITY_PRIVATE
)), TRUE
);
189 jam_doc_set_security(jw
->doc
, &sec
);
193 comments_cb(JamWin
*jw
, int action
, GtkCheckMenuItem
*item
) {
194 if (!gtk_check_menu_item_get_active(item
))
196 jam_doc_set_comments(jw
->doc
, action
- ACTION_ENTRY_COMMENTS_DEFAULT
);
200 screening_cb(JamWin
*jw
, int action
, GtkCheckMenuItem
*item
) {
201 if (!gtk_check_menu_item_get_active(item
))
203 jam_doc_set_screening(jw
->doc
, action
- ACTION_ENTRY_SCREENING_DEFAULT
);
207 backdated_cb(JamWin
*jw
, int action
, GtkCheckMenuItem
*item
) {
208 jam_doc_set_backdated(jw
->doc
, gtk_check_menu_item_get_active(item
));
212 preformatted_cb(JamWin
*jw
, int action
, GtkCheckMenuItem
*item
) {
213 jam_doc_set_preformatted(jw
->doc
, gtk_check_menu_item_get_active(item
));
216 picture_cb(GObject
*item
, JamWin
*jw
) {
218 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item
)))
220 pic
= g_object_get_data(item
, KEY_PICTUREKEYWORD
);
221 jam_doc_set_pickeyword(jw
->doc
, pic
);
227 cutcopypaste_cb(JamWin
*jw
, int action
) {
229 const char* signalname
;
233 case ACTION_CUT
: signalname
= "cut_clipboard"; break;
234 case ACTION_COPY
: signalname
= "copy_clipboard"; break;
235 case ACTION_PASTE
: signalname
= "paste_clipboard"; break;
239 /* verify that the focused widget actually responds to this signal
240 * before emitting it, because if it doesn't we get an ugly error. */
241 target
= gtk_window_get_focus(GTK_WINDOW(jw
));
242 signalid
= g_signal_lookup(signalname
, G_OBJECT_TYPE(target
));
244 g_signal_emit(target
, signalid
, 0); /* the last param appears to only
245 be used for property signals. */
249 undoredo_cb(JamWin
*jw
, int action
) {
250 UndoMgr
*um
= UNDOMGR(jam_view_get_undomgr(JAM_VIEW(jw
->view
)));
251 if (action
== ACTION_UNDO
) {
252 if (undomgr_can_undo(um
)) {
255 } else if (action
== ACTION_REDO
) {
256 if (undomgr_can_redo(um
)) {
263 menu_insert_file(JamWin
*jw
) {
264 tools_insert_file(GTK_WINDOW(jw
), jw
->doc
);
268 menu_insert_command_output(JamWin
*jw
) {
269 tools_insert_command_output(GTK_WINDOW(jw
), jw
->doc
);
273 menu_html_escape(JamWin
*jw
) {
274 tools_html_escape(GTK_WINDOW(jw
), jw
->doc
);
277 menu_remove_linebreaks(JamWin
*jw
) {
278 tools_remove_linebreaks(GTK_WINDOW(jw
), jw
->doc
);
281 menu_ljcut(JamWin
*jw
) {
282 tools_ljcut(GTK_WINDOW(jw
), jw
->doc
);
285 menu_validate_xml(JamWin
*jw
) {
286 tools_validate_xml(GTK_WINDOW(jw
), jw
->doc
);
289 menu_sync(JamWin
*jw
) {
290 sync_run(JAM_ACCOUNT_LJ(jw
->account
), GTK_WINDOW(jw
));
294 menu_console(JamWin
*jw
) {
295 g_assert(JAM_ACCOUNT_IS_LJ(jw
->account
));
296 console_dialog_run(GTK_WINDOW(jw
), JAM_ACCOUNT_LJ(jw
->account
));
300 menu_friends_manager(JamWin
*jw
) {
301 g_assert(JAM_ACCOUNT_IS_LJ(jw
->account
));
302 friends_manager_show(GTK_WINDOW(jw
), JAM_ACCOUNT_LJ(jw
->account
));
306 menu_html_mark_bold(JamWin
*jw
) {
307 html_mark_bold(jw
->doc
);
310 menu_html_mark_italic(JamWin
*jw
) {
311 html_mark_italic(jw
->doc
);
314 menu_html_mark_underline(JamWin
*jw
) {
315 html_mark_underline(jw
->doc
);
318 menu_html_mark_strikeout(JamWin
*jw
) {
319 html_mark_strikeout(jw
->doc
);
322 menu_html_mark_monospaced(JamWin
*jw
) {
323 html_mark_monospaced(jw
->doc
);
326 menu_html_mark_para(JamWin
*jw
) {
327 html_mark_para(jw
->doc
);
330 menu_html_mark_smallcaps(JamWin
*jw
) {
331 html_mark_smallcaps(jw
->doc
);
334 menu_html_mark_superscript(JamWin
*jw
) {
335 html_mark_superscript(jw
->doc
);
338 menu_html_mark_subscript(JamWin
*jw
) {
339 html_mark_subscript(jw
->doc
);
342 menu_html_mark_blockquote(JamWin
*jw
) {
343 html_mark_blockquote(jw
->doc
);
346 menu_html_mark_small(JamWin
*jw
) {
347 html_mark_small(jw
->doc
);
350 menu_html_mark_big(JamWin
*jw
) {
351 html_mark_big(jw
->doc
);
354 menu_html_mark_ulist(JamWin
*jw
) {
355 html_mark_ulist(jw
->doc
);
358 menu_html_mark_olist(JamWin
*jw
) {
359 html_mark_olist(jw
->doc
);
362 menu_html_mark_listitem(JamWin
*jw
) {
363 html_mark_listitem(jw
->doc
);
366 menu_html_mark_h2(JamWin
*jw
) {
367 html_mark_h3(jw
->doc
);
370 menu_html_mark_h3(JamWin
*jw
) {
371 html_mark_h3(jw
->doc
);
374 menu_html_mark_h4(JamWin
*jw
) {
375 html_mark_h4(jw
->doc
);
378 void manager_dialog(GtkWidget
*parent
);
381 menu_usejournal_changed(JamWin
*jw
) {
383 GtkWidget
*menu
, *musejournal
, *musejournalsep
;
386 acc
= jam_doc_get_account(jw
->doc
);
387 if (JAM_ACCOUNT_IS_LJ(acc
))
388 u
= jam_account_lj_get_user(JAM_ACCOUNT_LJ(acc
));
390 musejournal
= gtk_item_factory_get_item_by_action(jw
->factory
,
392 musejournalsep
= gtk_item_factory_get_item_by_action(jw
->factory
,
393 ACTION_JOURNAL_USE_SEP
);
395 if (!u
|| !u
->usejournals
) {
396 gtk_widget_hide(musejournal
);
397 gtk_widget_hide(musejournalsep
);
401 menu
= usejournal_build_menu(u
->username
,
402 jam_doc_get_usejournal(jw
->doc
),
404 jam_win_get_cur_doc(jw
));
405 gtk_menu_item_set_submenu(GTK_MENU_ITEM(musejournal
), menu
);
406 gtk_widget_show(musejournal
);
407 gtk_widget_show(musejournalsep
);
411 menu_make_bar(JamWin
*jw
) {
413 GtkAccelGroup
*accelgroup
= NULL
;
415 /* a note on accelerators:
416 * shift-ctl-[x] is used to type in UTF-8 chars;
417 * this means we can't use any shift-ctl accels
418 * using letters in the hex range [a-f]. */
419 static GtkItemFactoryEntry menu_items
[] = {
420 { N_("/_LogJam"), NULL
, NULL
, 0, "<Branch>" },
421 { N_("/_Edit"), NULL
, NULL
, 0, "<Branch>" },
422 { N_("/_View"), NULL
, NULL
, ACTION_VIEW
, "<Branch>" },
423 { N_("/_Journal"), NULL
, NULL
, ACTION_JOURNAL
, "<Branch>" },
424 { N_("/E_ntry"), NULL
, NULL
, 0, "<Branch>" },
425 { N_("/_Insert"), NULL
, NULL
, 0, "<Branch>" },
426 { N_("/_HTML"), NULL
, NULL
, 0, "<Branch>" },
428 { N_("/LogJam/_About LogJam..."), NULL
, about_dlg
, 0, "<StockItem>", "logjam-goat" },
429 { N_("/LogJam/_Servers and Users..."), NULL
, manager_dialog
, ACTION_MANAGER
, NULL
},
430 { N_("/LogJam/_Change User..."), NULL
, jam_do_changeuser
, ACTION_CHANGE_USER
, NULL
},
431 { N_("/LogJam/_Preferences..."), NULL
, settings_run
, 0, "<StockItem>", GTK_STOCK_PREFERENCES
},
432 { "/LogJam/---", NULL
, NULL
, 0, "<Separator>" },
433 { N_("/LogJam/_Quit"), "<ctl>Q", jam_quit
, 0, "<StockItem>", GTK_STOCK_QUIT
},
435 { N_("/Entry/_New"), NULL
, new_cb
, 0, "<StockItem>", GTK_STOCK_NEW
},
436 { N_("/Entry/_Open"), NULL
, NULL
, 0, "<Branch>" },
437 { N_("/Entry/Open/File..."), NULL
, jam_open_entry
, 0, "<StockItem>", GTK_STOCK_OPEN
},
438 { N_("/Entry/Open/Draft..."), "<ctl>D", jam_open_draft
, 0, NULL
},
439 { N_("/Entry/_Save"), NULL
, menu_save
, 0, "<StockItem>", GTK_STOCK_SAVE
},
440 { N_("/Entry/Save _As"), NULL
, NULL
, 0, "<Branch>" },
441 { N_("/Entry/Save As/_File..."), NULL
, menu_save_as_file
, 0, "<StockItem>", GTK_STOCK_SAVE_AS
},
442 { N_("/Entry/Save As/_Draft..."), NULL
, menu_save_as_draft
, 0, NULL
},
444 { "/Entry/---", NULL
, NULL
, 0, "<Separator>" },
445 { N_("/Entry/_Validate XML"), NULL
, menu_validate_xml
, 0, NULL
},
447 { N_("/Entry/_Preview HTML..."), NULL
, preview_ui_show
, 0, NULL
},
449 { "/Entry/---", NULL
, NULL
, ACTION_ENTRY_SUBMIT_SEP
, "<Separator>" },
450 { N_("/Entry/S_ubmit as New"), NULL
, jam_submit_entry
, ACTION_ENTRY_SUBMIT_NEW
, NULL
},
451 { N_("/Entry/_Save Changes to Server"), NULL
, jam_save_entry_server
, ACTION_ENTRY_SAVE_SERVER
, NULL
},
453 { N_("/Edit/_Undo"), "<ctl>Z", undoredo_cb
, ACTION_UNDO
, "<StockItem>", GTK_STOCK_UNDO
},
454 { N_("/Edit/_Redo"), "<ctl>R", undoredo_cb
, ACTION_REDO
, "<StockItem>", GTK_STOCK_REDO
},
455 { "/Edit/---", NULL
, NULL
, 0, "<Separator>" },
456 { N_("/Edit/Cu_t"), NULL
, cutcopypaste_cb
, ACTION_CUT
, "<StockItem>", GTK_STOCK_CUT
},
457 { N_("/Edit/_Copy"), NULL
, cutcopypaste_cb
, ACTION_COPY
, "<StockItem>", GTK_STOCK_COPY
},
458 { N_("/Edit/_Paste"), NULL
, cutcopypaste_cb
, ACTION_PASTE
, "<StockItem>", GTK_STOCK_PASTE
},
459 { "/Edit/---", NULL
, NULL
, 0, "<Separator>" },
460 { N_("/Edit/_HTML Escape"), NULL
, menu_html_escape
, 0, NULL
},
461 { N_("/Edit/_Remove Linebreaks"), NULL
, menu_remove_linebreaks
, 0, NULL
},
463 { N_("/Insert/_Poll..."), NULL
, run_poll_creator_dlg
, 0, NULL
},
464 { N_("/Insert/_File..."), NULL
, menu_insert_file
, 0, NULL
},
465 { N_("/Insert/Command _Output..."), NULL
, menu_insert_command_output
, 0, NULL
},
466 { "/Insert/---", NULL
, NULL
, 0, "<Separator>" },
467 { N_("/Insert/_Link..."), "<ctl>L", menu_make_link
},
468 { N_("/Insert/_Image..."), "<ctl>I", menu_insert_image
},
469 { N_("/Insert/_Journal Link..."), "<ctl><alt>L", menu_make_journal_link
},
470 { N_("/Insert/lj-_cut..."), "<ctl><alt>X", menu_ljcut
, 0, NULL
},
472 { N_("/View/_Security"), NULL
, menu_view_cb
, ACTION_VIEW_SECURITY
, "<CheckItem>" },
473 { N_("/View/Entry _Date"), NULL
, menu_view_cb
, ACTION_VIEW_DATESEL
, "<CheckItem>" },
474 { N_("/View/_Mood"), NULL
, menu_view_cb
, ACTION_VIEW_MOOD
, "<CheckItem>" },
475 { N_("/View/_Picture"), NULL
, menu_view_cb
, ACTION_VIEW_PICTURE
, "<CheckItem>" },
476 { N_("/View/_Tags"), NULL
, menu_view_cb
, ACTION_VIEW_TAGS
, "<CheckItem>" },
477 { N_("/View/M_usic"), NULL
, menu_view_cb
, ACTION_VIEW_MUSIC
, "<CheckItem>" },
478 { N_("/View/_Location"), NULL
, menu_view_cb
, ACTION_VIEW_LOCATION
, "<CheckItem>" },
479 { N_("/View/_Preformatted"), NULL
, menu_view_cb
, ACTION_VIEW_PREFORMATTED
, "<CheckItem>" },
480 { N_("/View/_Comments"), NULL
, menu_view_cb
, ACTION_VIEW_COMMENTS
, "<CheckItem>" },
481 { N_("/View/Scr_eening"), NULL
, menu_view_cb
, ACTION_VIEW_SCREENING
, "<CheckItem>" },
483 { N_("/HTML/_Bold"), "<ctl><alt>B", menu_html_mark_bold
},
484 { N_("/HTML/_Italic"), "<ctl><alt>I", menu_html_mark_italic
},
485 { N_("/HTML/_Strikeout"), "<ctl><alt>S", menu_html_mark_strikeout
},
486 { N_("/HTML/_Monospaced"), "<ctl><alt>M", menu_html_mark_monospaced
},
487 { N_("/HTML/_Underline"), "<ctl><alt>U", menu_html_mark_underline
},
488 { N_("/HTML/Small _Caps"), "<ctl><alt>C", menu_html_mark_smallcaps
},
489 { N_("/HTML/Block_quote"), "<ctl><alt>Q", menu_html_mark_blockquote
},
490 { N_("/HTML/_Paragraph"), "<ctl><shift>P", menu_html_mark_para
},
491 { "/HTML/---", NULL
, NULL
, 0, "<Separator>" },
492 { N_("/HTML/Heading _2"), "<ctl><alt>2", menu_html_mark_h2
},
493 { N_("/HTML/Heading _3"), "<ctl><alt>3", menu_html_mark_h3
},
494 { N_("/HTML/Heading _4"), "<ctl><alt>4", menu_html_mark_h4
},
495 { N_("/HTML/Bi_gger"), "<ctl><shift>B", menu_html_mark_big
},
496 { N_("/HTML/S_maller"), "<ctl><shift>S", menu_html_mark_small
},
497 { N_("/HTML/Superscrip_t"), "<ctl><shift>T", menu_html_mark_superscript
},
498 { N_("/HTML/S_ubscript"), "<ctl><shift>U", menu_html_mark_subscript
},
499 { "/HTML/---", NULL
, NULL
, 0, "<Separator>" },
500 { N_("/HTML/U_nordered List"), "<ctl><shift>N", menu_html_mark_ulist
},
501 { N_("/HTML/_Ordered list"), "<ctl><shift>O", menu_html_mark_olist
},
502 { N_("/HTML/_List item"), "<ctl><shift>L", menu_html_mark_listitem
},
504 { N_("/Journal/_Use Journal"), NULL
, NULL
, ACTION_JOURNAL_USE
, NULL
},
505 { "/Journal/---", NULL
, NULL
, ACTION_JOURNAL_USE_SEP
, "<Separator>" },
506 { N_("/Journal/_Friends..."), "<ctl>F", menu_friends_manager
, 0, NULL
},
507 { "/Journal/---", NULL
, NULL
, 0, "<Separator>" },
508 { N_("/Journal/_Load Last Entry"), NULL
, load_last_entry
, 0, NULL
},
509 { N_("/Journal/_Load Recent Entry..."), NULL
, run_history_recent_dlg
, 0, NULL
},
510 { N_("/Journal/_Load Offline Entry..."), NULL
, run_offline_dlg
, 0, NULL
},
511 { N_("/Journal/_Synchronize Offline Copy..."), NULL
, menu_sync
, 0, NULL
},
512 { "/Journal/---", NULL
, NULL
, 0, "<Separator>" },
513 { N_("/Journal/_LiveJournal Console..."), NULL
, menu_console
, ACTION_TOOLS_CONSOLE
, NULL
},
514 { N_("/Journal/_Web Links"), NULL
, NULL
, ACTION_WEB_LINKS
, "<Branch>" },
517 int itemcount
= sizeof(menu_items
) / sizeof(menu_items
[0]);
520 accelgroup
= gtk_accel_group_new();
521 jw
->factory
= gtk_item_factory_new(GTK_TYPE_MENU_BAR
, "<main>", accelgroup
);
522 g_object_ref(jw
->factory
);
523 gtk_item_factory_set_translate_func(jw
->factory
, gettext_translate_func
, NULL
, NULL
);
524 gtk_item_factory_create_items(jw
->factory
, itemcount
, menu_items
, jw
);
525 gtk_window_add_accel_group(GTK_WINDOW(jw
), accelgroup
);
527 bar
= gtk_item_factory_get_widget(jw
->factory
, "<main>");
530 jw
->msubmitsep
= gtk_item_factory_get_widget_by_action(jw
->factory
,
531 ACTION_ENTRY_SUBMIT_SEP
);
532 jw
->msubmit
= gtk_item_factory_get_widget_by_action(jw
->factory
,
533 ACTION_ENTRY_SUBMIT_NEW
);
534 jw
->msaveserver
= gtk_item_factory_get_widget_by_action(jw
->factory
,
535 ACTION_ENTRY_SAVE_SERVER
);
536 gtk_widget_hide(jw
->msaveserver
);
539 jw
->mundo
= gtk_item_factory_get_widget_by_action(jw
->factory
,
541 jw
->mredo
= gtk_item_factory_get_widget_by_action(jw
->factory
,
545 jw
->mweb
= gtk_item_factory_get_item_by_action(jw
->factory
, ACTION_WEB_LINKS
);
547 view
= jam_win_get_cur_view(jw
);
548 g_signal_connect(G_OBJECT(view
), "meta_toggle",
549 G_CALLBACK(meta_toggle_cb
), jw
);
550 /* the view has already loaded which metas are available;
551 * we tell it to emit those signals again. */
552 jam_view_emit_conf(view
);
556 gtk_widget_show(bar
);
561 menu_new_doc(JamWin
*jw
) {
562 JamDoc
*doc
= jw
->doc
;
563 g_signal_connect_swapped(doc
, "notify::account",
564 G_CALLBACK(menu_account_changed
), jw
);
565 g_signal_connect_swapped(doc
, "notify::usejournal",
566 G_CALLBACK(menu_usejournal_changed
), jw
);
567 menu_account_changed(jw
);
568 menu_usejournal_changed(jw
);
572 menu_spawn_url(GtkWidget
*w
, GtkWindow
*jw
) {
574 url
= g_object_get_data(G_OBJECT(w
), "url");
579 static GtkWidget
* webmenu_widget(JamWin
*jw
, GSList
*webmenu
);
582 webmenuitem_widget(JamWin
*jw
, LJWebMenuItem
*wmi
) {
583 GtkWidget
*item
= NULL
;
584 if (!wmi
->text
) { /* separator */
585 item
= gtk_menu_item_new();
586 } else if (wmi
->url
) { /* url menu item */
587 item
= gtk_image_menu_item_new_with_label(wmi
->text
);
588 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item
),
589 gtk_image_new_from_stock(GTK_STOCK_JUMP_TO
, GTK_ICON_SIZE_MENU
));
591 g_object_set_data_full(G_OBJECT(item
), "url", wmi
->url
, NULL
);
592 g_signal_connect(G_OBJECT(item
), "activate",
593 G_CALLBACK(menu_spawn_url
), jw
);
594 } else if (wmi
->subitems
) { /* submenu */
597 item
= gtk_menu_item_new_with_mnemonic(wmi
->text
);
598 submenu
= webmenu_widget(jw
, wmi
->subitems
);
599 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item
), submenu
);
605 webmenu_widget(JamWin
*jw
, GSList
*webmenu
) {
606 GtkWidget
*menu
, *item
;
609 menu
= gtk_menu_new();
610 for (l
= webmenu
; l
!= NULL
; l
= l
->next
) {
611 item
= webmenuitem_widget(jw
, l
->data
);
612 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
618 menu_update_web(JamWin
*jw
, JamAccount
*acc
) {
621 if (JAM_ACCOUNT_IS_LJ(acc
))
622 u
= jam_account_lj_get_user(JAM_ACCOUNT_LJ(acc
));
624 if (!u
|| !u
->webmenu
) {
625 gtk_widget_hide(jw
->mweb
);
629 gtk_menu_item_set_submenu(GTK_MENU_ITEM(jw
->mweb
),
630 webmenu_widget(jw
, u
->webmenu
));
631 gtk_widget_show_all(jw
->mweb
);
635 menu_account_changed(JamWin
*jw
) {
636 JamAccount
*acc
= jam_doc_get_account(jw
->doc
);
638 if (JAM_ACCOUNT_IS_LJ(acc
)) {
639 menu_update_web(jw
, acc
);
640 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw
->factory
,
642 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw
->factory
,
643 ACTION_JOURNAL
), TRUE
);
645 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw
->factory
,
646 ACTION_VIEW
), FALSE
);
647 gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(jw
->factory
,
648 ACTION_JOURNAL
), FALSE
);