comparison mcabber/mcabber/screen.c @ 2013:8dc418af3e72

Allow to select to which buddy resource messages go. Closes issue #55
author Hermitifier
date Thu, 01 Mar 2012 15:10:41 +0100
parents 2039ea6bd7a5
children db8ec238cd2c
comparison
equal deleted inserted replaced
2012:2039ea6bd7a5 2013:8dc418af3e72
1788 void scr_update_chat_status(int forceupdate) 1788 void scr_update_chat_status(int forceupdate)
1789 { 1789 {
1790 unsigned short btype, isgrp, ismuc, isspe; 1790 unsigned short btype, isgrp, ismuc, isspe;
1791 const char *btypetext = "Unknown"; 1791 const char *btypetext = "Unknown";
1792 const char *fullname; 1792 const char *fullname;
1793 char *fullnameres = NULL;
1794 const char *activeres;
1793 const char *msg = NULL; 1795 const char *msg = NULL;
1794 char status; 1796 char status;
1795 char *buf, *buf_locale; 1797 char *buf, *buf_locale;
1796 1798
1797 // Usually we need to update the bottom status line too, 1799 // Usually we need to update the bottom status line too,
1854 return; 1856 return;
1855 } 1857 }
1856 1858
1857 status = '?'; 1859 status = '?';
1858 1860
1861 activeres = buddy_getactiveresource(BUDDATA(current_buddy));
1862
1859 if (ismuc) { 1863 if (ismuc) {
1860 if (buddy_getinsideroom(BUDDATA(current_buddy))) 1864 if (buddy_getinsideroom(BUDDATA(current_buddy)))
1861 status = 'C'; 1865 status = 'C';
1862 else 1866 else
1863 status = 'x'; 1867 status = 'x';
1864 } else if (xmpp_getstatus() != offline) { 1868 } else if (xmpp_getstatus() != offline) {
1865 enum imstatus budstate; 1869 enum imstatus budstate;
1866 budstate = buddy_getstatus(BUDDATA(current_buddy), NULL); 1870 budstate = buddy_getstatus(BUDDATA(current_buddy), activeres);
1867 if (budstate < imstatus_size) 1871 if (budstate < imstatus_size)
1868 status = imstatus2char[budstate]; 1872 status = imstatus2char[budstate];
1869 } 1873 }
1870 1874
1871 // No status message for MUC rooms 1875 // No status message for MUC rooms
1872 if (!ismuc) { 1876 if (!ismuc) {
1873 GSList *resources, *p_res, *p_next_res; 1877 if (activeres) {
1874 resources = buddy_getresources(BUDDATA(current_buddy)); 1878 fullnameres = g_strdup_printf("%s/%s", fullname, activeres);
1875 1879 fullname = fullnameres;
1876 for (p_res = resources ; p_res ; p_res = p_next_res) { 1880 msg = buddy_getstatusmsg(BUDDATA(current_buddy), activeres);
1877 p_next_res = g_slist_next(p_res); 1881 } else {
1878 // Store the status message of the latest resource (highest priority) 1882 GSList *resources, *p_res, *p_next_res;
1879 if (!p_next_res) 1883 resources = buddy_getresources(BUDDATA(current_buddy));
1880 msg = buddy_getstatusmsg(BUDDATA(current_buddy), p_res->data); 1884
1881 g_free(p_res->data); 1885 for (p_res = resources ; p_res ; p_res = p_next_res) {
1882 } 1886 p_next_res = g_slist_next(p_res);
1883 g_slist_free(resources); 1887 // Store the status message of the latest resource (highest priority)
1888 if (!p_next_res)
1889 msg = buddy_getstatusmsg(BUDDATA(current_buddy), p_res->data);
1890 g_free(p_res->data);
1891 }
1892 g_slist_free(resources);
1893 }
1884 } else { 1894 } else {
1885 msg = buddy_gettopic(BUDDATA(current_buddy)); 1895 msg = buddy_gettopic(BUDDATA(current_buddy));
1886 } 1896 }
1887 1897
1888 if (msg) 1898 if (msg)
1890 else 1900 else
1891 buf = g_strdup_printf("[%c] %s: %s", status, btypetext, fullname); 1901 buf = g_strdup_printf("[%c] %s: %s", status, btypetext, fullname);
1892 replace_nl_with_dots(buf); 1902 replace_nl_with_dots(buf);
1893 buf_locale = from_utf8(buf); 1903 buf_locale = from_utf8(buf);
1894 mvwprintw(chatstatusWnd, 0, 1, "%s", buf_locale); 1904 mvwprintw(chatstatusWnd, 0, 1, "%s", buf_locale);
1905 g_free(fullnameres);
1895 g_free(buf_locale); 1906 g_free(buf_locale);
1896 g_free(buf); 1907 g_free(buf);
1897 1908
1898 // Display chatstates of the contact, if available. 1909 // Display chatstates of the contact, if available.
1899 if (btype & ROSTER_TYPE_USER) { 1910 if (btype & ROSTER_TYPE_USER) {
1900 char eventchar = 0; 1911 char eventchar = 0;
1901 guint event; 1912 guint event;
1902 1913
1903 // We do not specify the resource here, so one of the resources with the 1914 // We specify active resource here, so when there is none then the resource
1904 // highest priority will be used. 1915 // with the highest priority will be used.
1905 event = buddy_resource_getevents(BUDDATA(current_buddy), NULL); 1916 event = buddy_resource_getevents(BUDDATA(current_buddy), activeres);
1906 1917
1907 if (event == ROSTER_EVENT_ACTIVE) 1918 if (event == ROSTER_EVENT_ACTIVE)
1908 eventchar = 'A'; 1919 eventchar = 'A';
1909 else if (event == ROSTER_EVENT_COMPOSING) 1920 else if (event == ROSTER_EVENT_COMPOSING)
1910 eventchar = 'C'; 1921 eventchar = 'C';
2701 2712
2702 // Delete the current hbuf 2713 // Delete the current hbuf
2703 hbuf_free(&win_entry->bd->hbuf); 2714 hbuf_free(&win_entry->bd->hbuf);
2704 2715
2705 if (*p_closebuf) { 2716 if (*p_closebuf) {
2717 GSList *roster_elt;
2706 retval = TRUE; 2718 retval = TRUE;
2719 roster_elt = roster_find(key, jidsearch,
2720 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
2721 if (roster_elt)
2722 buddy_setactiveresource(roster_elt->data, NULL);
2707 } else { 2723 } else {
2708 win_entry->bd->cleared = FALSE; 2724 win_entry->bd->cleared = FALSE;
2709 win_entry->bd->top = NULL; 2725 win_entry->bd->top = NULL;
2710 } 2726 }
2711 return retval; 2727 return retval;
2747 if(buffer_purge((gpointer)cjid, win_entry, p_closebuf)) 2763 if(buffer_purge((gpointer)cjid, win_entry, p_closebuf))
2748 g_hash_table_remove(winbufhash, cjid); 2764 g_hash_table_remove(winbufhash, cjid);
2749 roster_msg_setflag(cjid, FALSE, FALSE); 2765 roster_msg_setflag(cjid, FALSE, FALSE);
2750 g_free(p_closebuf); 2766 g_free(p_closebuf);
2751 if (closebuf && !hold_chatmode) { 2767 if (closebuf && !hold_chatmode) {
2752 //buddy_setactiveresource(bud, resource);
2753 scr_set_chatmode(FALSE); 2768 scr_set_chatmode(FALSE);
2754 currentWindow = NULL; 2769 currentWindow = NULL;
2755 } 2770 }
2756 } else { 2771 } else {
2757 // (Special buffer) 2772 // (Special buffer)